recvfrom()始终返回零远程地址

时间:2016-05-17 20:57:57

标签: c sockets unix udp datagram

我正在编写一个简单的udp服务器应用程序,当我尝试获取远程连接用户的地址时遇到错误。

while(run == 1) {
    struct sockaddr_in client_addr;
    char message[1024];
    int len = recvfrom(sockfd, message, 1024, 0, (struct sockaddr*)&client_addr, sizeof client_addr);

    printf("Received request from: %s#%d\n", inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}

它始终返回远程地址:0.0.0.0#0

2 个答案:

答案 0 :(得分:4)

如果您阅读recvfrom的文档,则会看到最后一个参数是指向的指针,其中包含一个保存地址大小的socklen_t。

所以它应该是:

socklen_t client_addr_len = sizeof client_addr;
int len = recvfrom(....., (struct sockaddr*)&client_addr, &client_addr_len);

调用recvfrom后,client_addr_len将保留实际地址长度(理论上,如果它不是AF_INET地址,则可能小于缓冲区。)

答案 1 :(得分:1)

recvfrom()来电的最后一个参数不正确。它应该是socklen_t *类型的指针,指向最初存储地址大小的位置。该函数修改存储在那里的值,以反映地址结构的实际大小,就像它写入时一样,或者如果初始大小足够大,写入它。您改为传递实际大小,必须将其隐式转换为指针。你的编译器应该警告你。

鉴于程序没有崩溃,recvfrom()必须成功地从转换后的整数指向的地址读取值,并在那里成功写入值。很可能,它正在读取值0