C 符号不同-警告
我不明白gcc编译器中的警告。 警告是: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
警告:“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);