2013-01-07 96 views
0

我有一臺運行在同一臺Linux機器上的服務器(A)和一個用C語言編寫的客戶機(B)。 服務器將端口綁定到INADDR_ANY,客戶端將另一個端口綁定到INADDR_ANY。 當其他客戶端(C),這是另一 Linux機器上運行,連接到服務器,我希望服務器獲取客戶端B的IP地址,並將其發送給客戶端C.防止從getpeername()返回127.0.0.1

當我使用getpeername()從服務器,它返回「127.0.0.1」這是正確的,但我不能發送這個地址給客戶端C-它將無法連接到客戶端B與該地址。

有什麼聰明的方法來獲得客戶端B的實際IP? 如果稍微容易些,我可以讓每個客戶端發送它的IP給服務器。

謝謝!

回答

0

使用getifaddrs()來獲取接口IP地址,手冊頁中有一個例子。請注意,您可以發送任何接口的IP地址,因爲服務器使用INADDR_ANY進行綁定,因此它會偵聽所有接口。從人ip(7)

當INADDR_ANY在綁定調用指定的插座將 綁定到所有本地接口。

如果你想那麼公共 IP地址是指這樣一個問題:

Get public/external IP address?

+0

mux- getifaddrs()的問題是一臺計算機可能有多個IP地址,所以我只是不能捕捉到第一個不是127.0.0.1的IP。 – bomba6

+0

@ bomba6我認爲任何人都會這樣做,因爲服務器綁定到INADDR_ANY,它會監聽所有接口,以便接收數據包。 – iabdalkader

+0

感謝您的澄清。但客戶端C位於另一個網絡上的另一臺計算機上。我沒有冒險返回「內部」IP地址? – bomba6

0

你真正想知道的是接口的IP地址,這將被用於路由對客戶端C.
隨着Linux命令行,你可以這樣做(假設C爲10.0.0.1):

# ip route show match 10.0.0.1 
default via 20.0.0.2 dev eth0 
# ifconfig eth0 
eth0  Link encap:Ethernet HWaddr 00:00:00:00:00:00 
      inet addr:20.0.0.3 Bcast:20.0.0.255 Mask:255.255.255.0 

在這種情況下,您需要使用20.0.0.3

問題仍然是如何在C中獲取所有這些信息。 一種方法是連接到C上的某個服務,然後在生成的套接字上運行getsockname