recvfrom() 总是返回零远程地址

mat*_*ass 0 c unix sockets 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));
}
Run Code Online (Sandbox Code Playgroud)

它总是返回远程地址:0.0.0.0#0

use*_*751 5

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

所以应该是:

socklen_t client_addr_len = sizeof client_addr;
int len = recvfrom(....., (struct sockaddr*)&client_addr, &client_addr_len);
Run Code Online (Sandbox Code Playgroud)

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