我正在使用套接字在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)
,它现在肯定失败了.
看看签名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)
,它现在肯定失败了.