如何在 Unix 套接字编程中获取本地 IP 地址和端口?
Posted
技术标签:
【中文标题】如何在 Unix 套接字编程中获取本地 IP 地址和端口?【英文标题】:How to get local IP address and port in Unix socket programming? 【发布时间】: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()
。
【参考方案1】:
在调用getsockname
之前需要初始化addressLength
:
socklen_t addressLength = sizeof(localAddress);
【讨论】:
这次我的本地ip总是0.0.0.0,这正常吗? 如果你已经绑定到 0.0.0.0,那么是的。 @macs 那么我怎样才能获得 real ip? @can。如果您想获得您机器的 IP 地址,请查看this SO question。到目前为止,您所做的是绑定了一个套接字,并且该套接字在 0.0.0.0 上进行侦听,这意味着每个人都可以连接。 @macs 谢谢。我以前见过这个问题。我终于彻底了解了本地地址。 0.0.0.0 表示服务器的每个 接口 都接受传入的连接,在我的示例中,我只能从传输数据的套接字而不是侦听套接字获取确切的本地 IP。以上是关于如何在 Unix 套接字编程中获取本地 IP 地址和端口?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 udp-socket (C/C++) 获取您自己的(本地)IP 地址