2012-03-15 30 views
2

Winsockを使用してTCPサーバーアプリケーションを作成しています。私のサーバーが稼動するマシンとクライアントが稼働するマシンは、2つのNICを持っています。関係するIPアドレスは以下のとおりです。複数のNICを使用する場合のIPアドレス

  • サーバーNIC 1:192.168.132.14 < - これは私がバインドしたいものがある
  • サーバーNIC 2:192.168.132.15
  • クライアントNIC 1:192.168.132.16
  • クライアントNIC 2:192.168.132.17

質問1:私はINADDR_ANYを使用している場合、私のリスニングソケットをバインドするとき、私のサーバーアプリケーションで 、私の2つのIPアドレスのどちらが使用されますか? INADDR_ANYの代わりにinet_addr( "192.168.132.14")を使用するだけでいいと思います。

質問2: 私に接続する際にクライアントがどのIPアドレスを使用するかをクライアントはどのように制御できますか?彼はconnect()を呼び出す前に単にbind()を呼び出すでしょうか?私は彼がいずれかの住所からつながっていると見て喜んでいますか?

+0

INADDR_ANYは、両方のNICにバインドするので、他のIPの同じポートに既にリッスンしている他のソケットがない場合は、INADDR_ANYを使用できます。 source:http ://www.cs.cmu.edu/~srini/15-441/F01.full/www/assignments/P2/htmlsim_split/node18.html – SupremeDud

答えて

7

サーバーソケットでlisten()を呼び出すと、INADDR_ANYにバインドすると、ソケットはマシン上の使用可能なすべてのローカルIPにバインドされます。これにより、クライアントはサーバーの任意のIPに接続できます。サーバがinet_addr()を代わりに使用する場合、サーバがクライアント接続を受け付けることができる唯一のIPになります。

クライアントソケットでconnect()を呼び出すときには、サーバーがリッスンしている特定のIPを示す必要があります。クライアントが接続のエンドポイントに対してバインドするローカルIPを選択する場合は、connect()を呼び出す前にbind()を呼び出すことができます。クライアントが特定のIPにバインドされていないか、またはINADDR_ANYにバインドされている場合、接続されているサーバーIPへの利用可能なルートを持つ最初に見つかったIPが使用されます。

接続が確立されると、両者はそれぞれのソケットエンドポイントでいつでもgetsockname()getpeername()を呼び出して、その接続に実際に使用されているIP(およびポート)を検出できます。

関連する問題