recvfrom() 总是 return 零远程地址
recvfrom() always return zero remote address
我正在编写一个简单的 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));
}
它总是return远程地址:0.0.0.0#0
如果您阅读 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地址,理论上可以小于缓冲区)。
您的 recvfrom()
调用的最后一个参数不正确。它应该是 socklen_t *
类型的 指针 ,指向最初存储地址大小的位置。该函数修改存储在那里的值以反映地址结构的实际大小,如它所写的那样,或者如果初始大小足够大,它 会 写它。您改为传递实际大小,它必须隐式转换为指针。您的编译器应该就此警告您。
鉴于程序没有崩溃,recvfrom()
必须从转换后的整数指向的地址成功读取一个值,并在那里成功写入一个值。很可能,它正在读取值 0
.
我正在编写一个简单的 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));
}
它总是return远程地址:0.0.0.0#0
如果您阅读 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地址,理论上可以小于缓冲区)。
您的 recvfrom()
调用的最后一个参数不正确。它应该是 socklen_t *
类型的 指针 ,指向最初存储地址大小的位置。该函数修改存储在那里的值以反映地址结构的实际大小,如它所写的那样,或者如果初始大小足够大,它 会 写它。您改为传递实际大小,它必须隐式转换为指针。您的编译器应该就此警告您。
鉴于程序没有崩溃,recvfrom()
必须从转换后的整数指向的地址成功读取一个值,并在那里成功写入一个值。很可能,它正在读取值 0
.