为什么在流套接字上使用recvfrom()会返回零地址和端口?

时间:2017-08-19 13:09:36

标签: linux sockets networking recvfrom

我使用的是Linux系统,而不是Windows系统。我在下面发布了一些代码。请记住,此代码从未打算成为“生产质量”。

id selectedItem = [_sidebarOutlineView itemAtRow:[_sidebarOutlineView selectedRow]];
[noDataImage setImage:[NSImage imageNamed:[selectedItem stringByAppendingString:@".png"]]];

当代码运行并且您从两个或多个客户端(通过telnet)连接时,每条消息都将发件人显示为“0.0.0.0”,端口为0。

对于面向连接的套接字,recvfrom()的Windows文档说明“ fromlen 参数将被忽略。” Linux和POSIX文档没有提出这样的说法,并且甚至可以说recvfrom()“......可以用于接收套接字上的数据,无论它是否是面向连接的。”不知道 src_addr addrlen 将被忽略...所以我希望这些内容可以填补。

2 个答案:

答案 0 :(得分:4)

在连接的套接字上,您必须致电getpeername,然后继续使用inet_ntoa(请考虑使用inet_ntop,因为它支持多个地址系列)。根据手册页:

int getpeername(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);

答案 1 :(得分:1)

  

没有任何地方可以忽略 src_addr addrlen

这简直是不真实的。它说

  

如果src_addr不为NULL,且底层协议提供源地址,则填写此源地址。[强调添加]

你可以争论TCP是否可以说是提供源地址,但是你无法声称'无处可说......'。