2011-06-09 57 views
0

我想讓我的服務器從連接的TCP套接字中確定客戶端的源IP和端口。由於我的客戶可能支持NAT,所以我不能依賴客戶(在連接的協議中)告訴我......如果這是可能的,我將需要在Windows和Linux上實現它。 ..但任何一個答案都可以幫助我開始...你能確定連接的TCP套接字的源IP和端口嗎?

我使用C,我正在尋找基於libc或msvcrt的解決方案。

+1

可能複製? http://stackoverflow.com/questions/4186118/recovering-ip-port-from-socket-descriptor – 2011-06-09 20:14:53

回答

2

都應該在Linux和Windows工作:

struct sockaddr_in addr; 
socklen_t len; 

len = sizeof addr; 
getpeername(clientSocket, (struct sockaddr*)&addr, &len); 
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr)); 
+0

...儘管如此,但這隻適用於IPv4套接字。 – caf 2011-06-09 23:19:55

+0

他在哪裏說他想要一個ipv6解決方案? – jgauffin 2011-06-10 06:37:09

+0

他從哪裏說他沒有?這只是需要注意的一點 - 我投了這個答案* up *(不合格的「IP」對我說IPv4或IPv6)。 – caf 2011-06-10 07:26:33

0

如果您的客戶端位於NAT後面,則無法檢測到遠程IP。如果您嘗試這樣做,您將始終獲得NAT IP。我知道的唯一方法是將客戶端IP與請求一起發送到服務器(作爲請求的一部分)。

但是你不清楚你想要什麼。你不是在告訴我們你使用的是什麼語言,也不是你在說什麼類型的服務器。這會阻止我們給你一個有用的答案。

+0

我想知道NAT ... – dicroce 2011-06-09 17:04:54

+0

你使用什麼語言? – 2011-06-09 17:13:16

+0

我正在使用c,並且正在尋找基於libc或msvcrt的解決方案... – dicroce 2011-06-09 17:54:24

2

如果對等的NAT後面,你可以談論兩個不同的IP地址(這是從你的問題不清楚你想要哪一個):

  • 內部網絡中的節點的IP(如192.168 .1.2);
  • 的NAT本身

在前一種情況下的外部IP,沒有可用的解決方案從TCP/IP堆棧:此信息只是沒有你的主機上存在那裏,因爲NAT替換所有內部IP爲每個數據包使用自己的IP。所以唯一的解決方案就是在你的協議中支持這個功能。

在後一種情況下,您可以問TCP/IP協議棧:getpeername()是您如何做到的。