【发布时间】:2012-04-27 09:27:42
【问题描述】:
我用这个地址作为创建新服务器的地址(socket(), bind(), listen()):
struct sockaddr_in newServer;
memset(&newServer, 0, sizeof(newServer));
newServer.sin_family = AF_INET;
newServer.sin_addr.s_addr = htonl(INADDR_ANY);
newServer.sin_port = htons(UNUSED_PORT);
宏 UNUSED_PORT 定义为 0。
我希望让服务器监听任何接口和未使用的端口。
我尝试使用 getsockname() 来获取我的本地 IP 地址和端口,但我得到了一些奇怪的输出。输出代码如下:
struct sockaddr_in localAddress;
socklen_t addressLength;
getsockname(newServerfd, (struct sockaddr*)&localAddress, \
&addressLength);
printf("local address: %s\n", inet_ntoa( localAddress.sin_addr));
printf("local port: %d\n", (int) ntohs(localAddress.sin_port));
例如,我得到了 0.255.255.255:0、0.0.0.0:0、255.127.0.0:36237 等。 我的系统是 Mac OS X 10.7.3。
--更新--
使用socklen_t addressLength = sizeof(localAddress);(感谢@cnicutar 和@Jonathan Leffler)后,本地IP 总是得到0.0.0.0;可以吗?
【问题讨论】:
-
你真的读过http://beej.us/guide/bgnet/吗?
-
以上是Beej的网络编程指南
-
@macs 似乎堆栈溢出中的每个人都推荐这个指南,真的那么好吗?
-
我是这么认为的,因为它是一步一步详细描述所有这些结构的。
-
@Sebastian:这是一个很好的指南,但它没有描述
getsockname()。