2012-03-25 11 views
2

私はCソケットを使ってクライアント/サーバプログラムを書いています。私は、サーバーがsockaddr_in.sin_addr.s_addrのINADDR_ANYを使用して、任意のネットワークインターフェイスでリッスンできることを指定しています。これは0.0.0.0のIPに相当します。サーバーがリッスンしている実際のIPを取得することは可能ですか? (例:192.168.1.100)CリスニングサーバのIPを取得する

+0

接続が確立される前または後でか。サーバーが複数のアドレスでリッスンする可能性があります。 – blueshift

+0

の前に。私の場合、私は1つのIPだけを持っています。ちょうど私はシステムが決定するようにしています。しかし、私はまだそれが何を決定するか知りたい。 – Gigi

+3

サーバは利用可能なすべての*インタフェースをリッスンします。単一のインターフェースでも複数のIPアドレスを持つことができます。 –

答えて

0

私は最終的にsolution that worksを見つけることができました。

を編集してください:リンクは死んでいますので、Internet Archive linkをご覧ください。

私にとっては、他の人にも役立つことを願っています。

+0

IPv6で動作しないため、IPv6のサポートは必要ないと思います。 –

+0

いいえ、私はしません。しかし、あなたがなぜそれが適切でないのかを説明すれば、そうする人を助けるかもしれません。私は、使用される関数呼び出しにはIPv6の同等物があると思います。 – Gigi

+1

'getaddrinfo'関数([linux docs](http://linux.about.com/library/cmd/blcmdl3_getaddrinfo.htm)、[Windows文書](http://msdn.microsoft.com/en-us/)は、ライブラリ/ windows/desktop/ms738520(v = vs.85).aspx))はIPv6対応であり、同じ機能を実行します。 –

1

リスニングソケットをINADDR_ANYにバインドすると、ソケットは使用可能なすべてのローカルIPをリッスンします。ソケットからリッスンしているIPを特定する方法はありません。その情報が必要な場合は、ローカルIPを別々に列挙しなければなりません(その場合は、pre-acceptバインディングの詳細を調べる必要がある場合は、それぞれのIPを個別のソケットに個別にbind()個だけ渡すことができます)。ただし、accept()が確立したクライアント接続を返すと、受け入れられたソケットでgetsockname()を使用して、特定のIPが接続を受け入れたことを知ることができます。

関連する問題