当前位置:  开发笔记 > 程序员 > 正文

简单的消息传递应用程序...获得错误14:糟糕的地址

如何解决《简单的消息传递应用程序获得错误14:糟糕的地址》经验,为你挑选了1个好方法。

我正在使用套接字在C中编写一个简单的消息传递应用程序 当我使用函数时recvfrom,它返回-1并设置errno = 14哪个Bad address(我在最后打印).

奇怪的是它仍然从套接字读取并获取正确的消息.也就是说,除了错误之外,应用程序正在按预期工作.

我的问题是:你为什么认为我收到这个错误?我想不出任何理由.我正在使用inet_pton设置,peer->sin_addr但我得到了同样的错误.

// socket file descriptor to send data through
int recv_sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);

// fill in the peer's address, loopback in this case
struct sockaddr_in *peer = malloc(sizeof(struct sockaddr_in));
peer->sin_family = AF_INET;
peer->sin_port   = htons(11110);
char *new = &(peer->sin_addr);
new[0] = 127;
new[1] = 0;
new[2] = 0;
new[3] = 1;
for (int i = 0; i < 8; i++) {
    peer->sin_zero[i] = NULL;
}

bind(recv_sock_fd, peer, sizeof(struct sockaddr_in)); 

// check to see if the socket has any data...code removed

char buff[32] = {0};
errno = 0;
int bytes_received = recvfrom(recv_sock_fd, buff, sizeof(buff), NULL, (struct sockaddr *)peer, sizeof(struct sockaddr_in));

printf("Bytes recieved: %d: %d : %s\n", bytes_received, errno, strerror(errno));

Nikolai Feti.. 7

看看签名recvfrom(2):

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

最后一个参数是一个地址,而你给它一个普通的整数.

那么你构建的IP地址是错误的.使用inet_pton(3),这就是它的用途.还要检查它的返回值bind(2),它现在肯定失败了.



1> Nikolai Feti..:

看看签名recvfrom(2):

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

最后一个参数是一个地址,而你给它一个普通的整数.

那么你构建的IP地址是错误的.使用inet_pton(3),这就是它的用途.还要检查它的返回值bind(2),它现在肯定失败了.


正确 - 它是一个输入/输出参数,所以你应该初始化`socklen_t slen = sizeof(struct sockaddr_in);`并传递`&slen`.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有