Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 符号不同-警告_C_Gcc_Warnings_Socklen T - Fatal编程技术网

C 符号不同-警告

C 符号不同-警告,c,gcc,warnings,socklen-t,C,Gcc,Warnings,Socklen T,我不明白gcc编译器中的警告。 警告是:警告:“recvfrom”传递参数6中的指针目标的签名不同我不知道哪里有问题,我没有使用有符号和无符号的值 问题在线: recvfrom(server_socket, inputbuffer, maxLenght, 0, (struct sockaddr*) remote_addr, &server_addr_len); 我试过这个: recvfrom(server_socket, inputbuffer, maxLenght, 0, (unsi

我不明白gcc编译器中的警告。 警告是:
警告:“recvfrom”传递参数6中的指针目标的签名不同
我不知道哪里有问题,我没有使用
有符号和无符号的

问题在线:

recvfrom(server_socket, inputbuffer, maxLenght, 0, (struct sockaddr*) remote_addr, &server_addr_len);
我试过这个:

recvfrom(server_socket, inputbuffer, maxLenght, 0, (unsigned int) remote_addr, &server_addr_len);

但这对我没有帮助。谢谢您的建议和解释。

只需声明
服务器地址
socklen\t

socklen_t server_addr_len;
因为函数签名是

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
         struct sockaddr *src_addr, socklen_t *addrlen);
发件人:

recvfrom()
需要一个
socklen\u t
作为第六个参数。您可能传递了一个
int

因此,定义
server\u addr\u len
如下:

socklen_t server_addr_len;
请参阅
recvfrom()
的说明

它说,功能原型是

 ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
             struct sockaddr *src_addr, socklen_t *addrlen);
第六个参数是
socklen\u t*addrlen
。因此,在从应用程序调用
recvfrom()
时,您必须像这样使用它

socklen_t server_addr_len = 0;
struct sockaddr * remote_addr = NULL;
ssize_t retval = 0;
.
. 
retval = recvfrom(server_socket, inputbuffer, maxLenght, 0, remote_addr, &server_addr_len);
旁注:

1.定义变量的方式应使其不需要强制转换。良好做法

二,。检查
recvfrom()
[或在这种情况下,任何库调用]的返回值是否成功。

哪一个是第6个参数?感谢您的回复,但是
gcc
编译器无法编译此参数。请勿将指针强制转换为其他类型的指针。如果所指的两种类型的大小不同,这可能会导致desaster。@iharob是的,有区别。但为什么你们说要声明,为什么不在这里使用定义术语呢?你能详细说明一下吗?谢谢。只有
usigned int
使我的编译器感到高兴。@iharob好的,对,但通常初始化变量是更好的做法。结合起来,它就形成了一个定义。:-)@在你的例子中,
socklen\u t
可能是
unsigned int
的类型定义。。。为什么要冒险?@iharob:“
socklen\u t server\u addr\u len;
”是一个完美有效的定义(也是一个隐式声明)。而“
server\u addr\u len=someValue;
”不是一个定义,而是一个初始化<代码>套接字服务器地址既是声明又是定义<代码>外部套接字服务器地址将只是一个声明<代码>socklen\u t server\u addr\u len=0是声明、定义和初始化@iharob供您参考:谢谢您证明了这个链接。但有一个问题是,是否与存储类有关?我的意思是,我可以这样说“在
auto
存储的情况下,
socklen\t server\u addr\u len;
始终是一个有效的定义,但是,对于
extern
,情况可能并不总是这样”,请记住,
-fno common
在编译时缺失?声明是承诺,“定义”是事实@苏拉沃什
socklen_t server_addr_len = 0;
struct sockaddr * remote_addr = NULL;
ssize_t retval = 0;
.
. 
retval = recvfrom(server_socket, inputbuffer, maxLenght, 0, remote_addr, &server_addr_len);