分页: 1 / 1

为什么使用getsockopt()函数总提示参数不符合规范?

发表于 : 2013-03-04 21:52
cmjauto
大家好!
最近在使用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编程以来感觉步履维艰,还望各位朋友指点一番,谢谢!

Re: 为什么使用getsockopt()函数总提示参数不符合规范?

发表于 : 2013-03-04 22:16
YeLee
亲,把socklen_t *len修改为socklen_t len看看。

Re: 为什么使用getsockopt()函数总提示参数不符合规范?

发表于 : 2013-03-05 18:59
cmjauto
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> 这两个头文件在哪里呢?
方便的时候,还请回复下,谢谢!

Re: 为什么使用getsockopt()函数总提示参数不符合规范?

发表于 : 2013-03-05 20:31
YeLee
[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即可。

Re: 为什么使用getsockopt()函数总提示参数不符合规范?

发表于 : 2013-03-05 21:56
cmjauto
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/下找到的,解决了一个心病,呵呵