当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 为什么使用getsockopt()函数总提示参数不符合规范?
帖子发表于 : 2013-03-04 21:52 

注册: 2013-01-23 21:46
帖子: 27
系统: windows xp
送出感谢: 2
接收感谢: 0 次
大家好!
最近在使用getsockopt()函数,按照书上的例子写下来,可是编译总是提出警告,警告如下:

警告: 传递‘getsockopt’的第 5 个参数时在不兼容的指针类型间转换 [默认启用]
附注: 需要类型‘socklen_t * __restrict__’,但实参的类型为‘socklen_t **’


我的代码如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s;
int val;
socklen_t *len;
//len = sizeof(int);
if((s = socket(AF_INET,SOCK_STREAM,0))<0)
{
perror("connect");
exit(1);
}
else
{
printf("A socket was created.\n");
printf("socket number: %d\n",s);
}
getsockopt(s,SOL_SOCKET,SO_TYPE,&val,*len); //第五个参数有问题,未解决

我也查过getsockopt的用法,但还是不解第五个参数应该如何设置。这里还有一个问题,就是怎么找到#include <sys/types.h>中这个types.h 头文件,我在/usr/include /usr/lib 甚至在文件系统根目录/下用find指令查找也没有找到这个头文件,包括没有找到那个sys文件夹……
从学习linux下C编程以来感觉步履维艰,还望各位朋友指点一番,谢谢!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 为什么使用getsockopt()函数总提示参数不符合规范?
帖子发表于 : 2013-03-04 22:16 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
亲,把socklen_t *len修改为socklen_t len看看。


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 为什么使用getsockopt()函数总提示参数不符合规范?
帖子发表于 : 2013-03-05 18:59 

注册: 2013-01-23 21:46
帖子: 27
系统: windows xp
送出感谢: 2
接收感谢: 0 次
YeLee 写道:
亲,把socklen_t *len修改为socklen_t len看看。


亲,不行的,改成socklen_t len之后还是有警告,如下:
警告: 传递‘getsockopt’的第 5 个参数时将整数赋给指针,未作类型转换 [默认启用]
附注: 需要类型‘socklen_t * __restrict__’,但实参的类型为‘socklen_t’

另外,我还想问下,#include <sys/types.h> #include <sys/socket.h> 这两个头文件在哪里呢?
方便的时候,还请回复下,谢谢!


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 为什么使用getsockopt()函数总提示参数不符合规范?
帖子发表于 : 2013-03-05 20:31 
头像

注册: 2008-08-13 8:48
帖子: 26391
地址: 东海硇州,一双管钥。
系统: Fundu i64
送出感谢: 50
接收感谢: 344
[c]
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
int s;
int val;
socklen_t len;//定义为非指针
len = sizeof(int);
if((s = socket(AF_INET,SOCK_STREAM ,0))<0)
{
perror("connect");
exit(1);
}
else
{
printf("A socket was created.\n");
printf("socket number: %d\n" ,s);
}
getsockopt(s ,SOL_SOCKET ,SO_TYPE ,&val ,&len); //这里传递一个指针变量,印象中*optlen这种返回参数长度的函数要注意作用域的问题。
[/c]
好吧,忘记当时是修改了两个地方的了。 :em06 :em06 :em06
getsockopt的第五个参数传递的是一个指针,不过,你前面当然可以保留为socklen_t *len,不过,第五个参数可能需要修为getsockopt(s,SOL_SOCKET,SO_TYPE,&val,len),只是这是一个不保险的办法,作用域问题可能导致变量丢失。
至于<sys/types.h>这个文件,之前版本的系统可以在/usr/include/sys/types.h下面找到。只是,debian迁移到Multiarch后文件也被迁移到了/usr/include/$(uname -m)-linux-gnu/sys/types.h下面了,假如找不到这个文件的话,可能是glibc的开发库还没有安装,用软件中心安装libc6-dev即可。
不过,查看一个函数定义还是推荐看手册,直接man 2 getsockopt即可。


_________________
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关



_________________
评价: 3.7% cmjauto
 
页首
 用户资料  
 
5 楼 
 文章标题 : Re: 为什么使用getsockopt()函数总提示参数不符合规范?
帖子发表于 : 2013-03-05 21:56 

注册: 2013-01-23 21:46
帖子: 27
系统: windows xp
送出感谢: 2
接收感谢: 0 次
YeLee 写道:
好吧,忘记当时是修改了两个地方的了。 :em06 :em06 :em06
getsockopt的第五个参数传递的是一个指针,不过,你前面当然可以保留为socklen_t *len,不过,第五个参数可能需要修为getsockopt(s,SOL_SOCKET,SO_TYPE,&val,len),只是这是一个不保险的办法,作用域问题可能导致变量丢失。
至于<sys/types.h>这个文件,之前版本的系统可以在/usr/include/sys/types.h下面找到。只是,debian迁移到Multiarch后文件也被迁移到了/usr/include/$(uname -m)-linux-gnu/sys/types.h下面了,假如找不到这个文件的话,可能是glibc的开发库还没有安装,用软件中心安装libc6-dev即可。
不过,查看一个函数定义还是推荐看手册,直接man 2 getsockopt即可。


问题已经解决了,谢谢您,
头文件是在/usr/include/i386-linux-gnu/sys/下找到的,解决了一个心病,呵呵


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译