如何在 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 地址和端口?的主要内容,如果未能解决你的问题,请参考以下文章

Linux/UNIX网络编程的目录

在 C 中使用 bind() 时获取错误的 IP 地址

如何从 udp-socket (C/C++) 获取您自己的(本地)IP 地址

如何以编程方式获取计算机的本地网络 IP 地址?

UNIX网络编程——getsockname和getpeername函数

如何获取本地计算机的 IP 地址?