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

can*_*an. 3 c unix sockets ip port

我用这个作为地址来创建一个新的服务器(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);
Run Code Online (Sandbox Code Playgroud)

宏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));
Run Code Online (Sandbox Code Playgroud)

例如,我得到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 Leffler),我总是得到0.0.0.0的本地IP; 那好吗?

cni*_*tar 6

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

socklen_t addressLength = sizeof(localAddress);
Run Code Online (Sandbox Code Playgroud)