c - 简单的消息传递应用程序...获取 errno 14 : bad address

标签 c sockets errno

我正在使用套接字用 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));

最佳答案

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) 的返回值, 现在肯定失败了。

关于c - 简单的消息传递应用程序...获取 errno 14 : bad address,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8320090/

相关文章:

C RbPi UART 远程控制 socket

c - 在 C 中,这个基本的堆栈实现会出现段错误。如何修复它?

node.js - 强制 API 超时时 Node JS 中的套接字挂断错误

c - 错误 : parameter for <variable> is initialized in C

python - 由 multiprocessing.Manager() 启动的服务器进程使管道套接字不会立即关闭

unix - 哪些系统将EAGAIN和EWOULDBLOCK定义为不同的值?

python - 从 Python 访问 errno?

c - 如何查看errno的值?

c - 制作我自己的 printf 函数?

c - Xcode中编译时全局变量错误(C编程)