2012-03-15 102 views
2

我正在使用Winsock編寫TCP服務器應用程序。我的服務器運行的機器和運行客戶機的機器都有2個網卡。涉及的IP地址是:涉及多個NIC時的IP地址

  • 服務器NIC 1:192.168.132.14 < - 這是一個我要綁定
  • 服務器NIC 2:192.168.132.15
  • 客戶端網卡1:192.168.132.16
  • 客戶端網卡2:192.168.132.17

問題1: 在我的服務器應用程序,如果我結合我的監聽套接字,當使用INADDR_ANY其中我的兩個IP地址將被使用?假設沒有任何說明,我應該正確地使用inet_addr(「192.168.132.14」)來代替INADDR_ANY嗎?

問題2: 客戶端如何控制連接到我時使用的IP地址?他會在調用connect()之前簡單地調用bind()嗎?我是否有責任將他視爲從任一地址連接(不知道哪一個)?

+0

INADDR_ANY將綁定到兩個NIC所以只要你沒有在已經聽其他套接字(或會盡量聽)到另一個IP相同的端口,你可以使用INADDR_ANY 出處:http ://www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html – SupremeDud 2012-03-15 19:38:15

回答

7

在服務器套接字上調用listen()時,綁定到INADDR_ANY會將套接字綁定到計算機上所有可用的本地IP。這允許客戶端連接到任何服務器的IP。如果服務器使用inet_addr(),那將是服務器可以接受客戶端連接的唯一IP。

在客戶端套接字上調用connect()時,它必須指示服務器正在偵聽的特定IP。如果客戶想要選擇綁定其連接端點的本地IP,則可在致電connect()之前自行呼叫bind()。如果客戶端不綁定到特定IP,或者綁定到INADDR_ANY,套接字將使用它發現的第一個IP,該IP具有到所連接的服務器IP的可用路由。

連接建立後,雙方隨時都可以在其各自的套接字端點上調用getsockname()getpeername(),以發現哪些IP(和端口)實際上正在用於該連接。