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

软件和网站开发以及相关技术探讨
回复
cmjauto
帖子: 27
注册时间: 2013-01-23 21:46
系统: windows xp

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

#1

帖子 cmjauto » 2013-03-04 21:52

大家好!
最近在使用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编程以来感觉步履维艰,还望各位朋友指点一番,谢谢!
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

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

#2

帖子 YeLee » 2013-03-04 22:16

亲,把socklen_t *len修改为socklen_t len看看。
◎当我站在道德的高度上俯视别人的时候,发现自己是多么渺小。
♥执着但不偏激,反对而不排斥,坚决捍卫矛盾体的存在方式。
★★★天气预报★★★
fcitx-yatable一个可以使用的码表输入法
[教程]几个实例攻克软件编译难关
Gentoo Development Guide
字体相关
cmjauto
帖子: 27
注册时间: 2013-01-23 21:46
系统: windows xp

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

#3

帖子 cmjauto » 2013-03-05 18:59

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> 这两个头文件在哪里呢?
方便的时候,还请回复下,谢谢!
头像
YeLee
论坛版主
帖子: 26406
注册时间: 2008-08-13 8:48
系统: Fundu i64
来自: 东海硇州,一双管钥。
联系:

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

#4

帖子 YeLee » 2013-03-05 20:31

[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
字体相关
cmjauto
帖子: 27
注册时间: 2013-01-23 21:46
系统: windows xp

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

#5

帖子 cmjauto » 2013-03-05 21:56

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/下找到的,解决了一个心病,呵呵
回复