【问题标题】:Simple messaging application...getting errno 14: bad address简单的消息传递应用程序...获取 errno 14:错误地址
【发布时间】:2011-11-30 01:32:14
【问题描述】:

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

【问题讨论】:

    标签: c sockets errno


    【解决方案1】:

    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);并传递&amp;slen
    • 别担心,我们都去过那里:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2015-12-03
    • 2016-07-23
    • 2020-10-21
    • 2012-04-08
    • 2012-08-12
    相关资源
    最近更新 更多