1

ネットワークソケットを使用する C++ でプログラムを書いています。ユーザーに表示できるように、コンピューターの IP アドレスを調べる必要があります。プログラムは、Windows および Linux で実行する必要があります。

コンピュータは複数の IP アドレスを持つことができるとどこかで聞いたことがあります。別のコンピューター上の他のプログラムがコンピューターに接続するために使用できるものが必要です。

これは私がすでに持っている関連コードです(変数は他の場所で宣言されています):

master = new fd_set;
FD_ZERO(master);
struct sockaddr_in my_addr;

listener = socket(PF_INET, SOCK_STREAM, 0);

my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(port);
my_addr.sin_addr.s_addr = INADDR_ANY;
memset(my_addr.sin_zero, '\0', sizeof my_addr.sin_zero);

bind(listener, (struct sockaddr *)&my_addr, sizeof my_addr);

listen(listener, 10);

FD_SET(listener, master);

fdmax = listener;
4

6 に答える 6

5

コンピュータは複数の IP アドレスを持つことができるとどこかで聞いたことがあります。別のコンピューター上の他のプログラムがコンピューターに接続するために使用できるものが必要です。

うーん...それはそれらのいずれかである可能性があります。コンピューターに複数の IP アドレスがある場合、それらのいずれかでアクセスできます。もちろん、そのうちの 1 つが異なるファイアウォール ルールの対象になったり、2 つの完全に異なるセグメントに存在したりする可能性がありますが、これらの状況のすべてを検出する方法はありません。

于 2009-01-27T23:07:27.993 に答える
5

同様の質問を投稿しましたが、最近 OS X に投稿しました。私が受け取った答えは、0.0.0.0 または INADDR_ANY のいずれかを使用することでした。これにより、ソケットは利用可能なすべてのアドレスをリッスンするため、どれが「正しい」アドレスであるかを判断する必要はありません。

于 2009-01-27T23:32:04.777 に答える
4

Windows では、GetAdaptersAddressesを使用します。これにより、マシン内のすべてのアダプターとそれらにバインドされた IP アドレスが一覧表示されます。IPv6 アドレスもサポートしています。gethostbynameも使用できますが、これは IPv6 をサポートしていません。

Linux では、その結果を読み取り/proc/net/dev/proc/net/if_inet6解析します。

于 2009-01-27T23:34:18.440 に答える
2

バインド先のソケットの IP アドレスを取得するには、リスナー ソケットで getaddrinfo() を使用できると思います。

于 2009-01-27T23:17:59.487 に答える
0

C++プロジェクトの軽量クライアント/サーバー ソケット クラスを参照用に使用できます。

于 2009-01-28T06:07:11.970 に答える
0

LAN IP アドレス (つまり、コンピューターのセット内のコンピューターのアドレス) を取得しようとしているか、インターネットに接続するたびにサービス プロバイダーから提供される IP アドレスを取得しようとしているかによって異なります。後者は、いくつかの IP 検出 Web サービスへのクエリで識別できます (Google をほとんど使わずにそれを行う適切な C++ ライブラリが見つかると思います)。

迅速で汚い解決策が必要な場合は、wget http://www.whatismyip.orgを試して内容を読み返すことができます。

于 2009-01-27T23:15:22.317 に答える