签名不同 - 警告

时间:2014-12-23 12:18:22

标签: c gcc warnings socklen-t

我在gcc编译器中不理解我的警告。 警告是:warning: pointer targets in passing argument 6 of ‘recvfrom’ differ in signedness我不知道,问题出在哪里,我没有使用signed and unsigned值。

问题在线:

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);

但它并没有帮助我。感谢您的建议和解释。

3 个答案:

答案 0 :(得分:5)

来自man recvfrom()

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

recvfrom()期望socklen_t为第6个参数。您可能会传递int

所以如此定义server_addr_len

socklen_t server_addr_len;

答案 1 :(得分:2)

请参阅recvfrom()的{​​{3}}。

它说,函数原型是

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

第6个参数是socklen_t *addrlen。因此,在从应用程序调用{​​{1}}时,您必须像

一样使用它
recvfrom()

SideNotes:

1.以某种方式定义变量,使它们不需要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); 。好的做法。

2。检查cast [或者对于这种情况,任何库调用]的返回值是否成功。 功能

答案 2 :(得分:1)

只需将server_addr_len声明为socklen_t

即可
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);