2012-03-25 100 views
2

我正在使用C套接字編寫客戶端/服務器程序。我指定服務器可以通過在sockaddr_in.sin_addr.s_addr中使用INADDR_ANY來監聽任何網絡接口。這相當於IP爲0.0.0.0。我能否獲得服務器正在監聽的實際IP? (例如192.168.1.100)C爲監聽服務器獲取IP

+0

連接建立之前還是之後?服務器可能正在監聽幾個地址。 – blueshift 2012-03-25 13:18:00

+0

之前。就我而言,我只會擁有一個IP。只是讓系統決定。但我仍然想知道它的決定。 – Gigi 2012-03-25 13:19:24

+3

服務器將偵聽可用的* all *接口。即使一個接口可能有多個IP地址。 – 2012-03-25 13:25:43

回答

0

我終於能夠找到一個solution that works

編輯:鏈接已死,所以請參閱:Internet Archive link

希望它可以幫助別人,因爲它對我來說。

+0

我希望你不需要IPv6支持,因爲這不適用於IPv6。 – 2012-04-06 11:30:52

+0

不,我不知道。但如果你解釋爲什麼它不合適,它可能會幫助那些做的人。我認爲使用的函數調用具有與IPv6相當的功能。 – Gigi 2012-04-06 11:51:43

+1

'getaddrinfo'函數([linux文檔](http://linux.about.com/library/cmd/blcmdl3_getaddrinfo.htm),[Windows文檔](http://msdn.microsoft.com/en-us/ library/windows/desktop/ms738520(v = vs.85).aspx))可以識別IPv6並執行相同的功能。 – 2012-04-06 12:31:43

1

將偵聽套接字綁定到INADDR_ANY時,套接字會偵聽所有可用的本地IP。沒有辦法從套接字確定它正在監聽的IP地址。如果您需要這些信息,則必須單獨列舉本地IP(如果您需要檢索預先接受綁定的詳細信息,則可以單獨將每個IP分別輸入bind())。但是,一旦accept()已返回已建立的客戶端連接,您可以在接受的套接字上使用getsockname()來知道哪個特定的IP接受了連接。