如何在Unix套接字编程中获取本地IP地址和端口?

如何在Unix套接字编程中获取本地IP地址和端口?

问题描述:

我用这个作为地址来创建一个新的服务器(socket()bind()listen()):为0如何在Unix套接字编程中获取本地IP地址和端口?

我希望得到一个服务器侦听任何接口上

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定义并在未使用的端口上。

我试图使用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。

--update--

使用socklen_t addressLength = sizeof(localAddress);(感谢@cnicutar和@Jonathan莱弗勒)后,我总是得到0.0.0.0本地IP;那还好吗?

+0

你真的读[http://beej.us/guide/bgnet/](http://beej.us/guide/bgnet/ )? – 2012-04-16 05:52:41

+0

上面的一个是Beej的网络编程指南 – 2012-04-16 06:04:47

+0

@macs似乎每个人都在堆栈溢出推荐本指南,真的很好吗? – 2012-04-17 03:19:27

你需要调用getsockname之前初始化addressLength

socklen_t addressLength = sizeof(localAddress); 
+0

ommmm ...我错过了 - -b .. – 2012-04-16 01:07:00

+0

这次我总是得到本地ip的0.0.0.0,这是正常的吗? – 2012-04-17 03:20:43

+0

如果你已经绑定到0.0.0.0,那么是的。 – 2012-04-17 04:09:29