2012-04-16 181 views
2

我用這個作爲地址來創建一個新的服務器(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

回答

6

你需要調用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

相關問題