1. ホーム
  2. c

[解決済み] ソケットプログラミングのためのINADDR_ANYの理解

2022-03-07 10:58:03

質問

私はいくつかのソケットをプログラムしようとしているので、サーバー側で htonl(INADDR_ANY) . 私が理解した範囲では、この関数はランダムなIPを生成しているようです(私は正しいですか)。実際、私は私のソケットを私の localhost . しかし、私はこれを実行すると

printf("%d",htonl(INADDR_ANY));

戻り値として0が返ってきます。どなたか解説をお願いします。

解決方法は?

  1. bind()INADDR_ANY する NOT "ランダムなIPを生成する"。それは ソケットを利用可能なすべてのインターフェースにバインドする .

  2. サーバーの場合、通常、"localhost" だけでなく、すべてのインターフェイスにバインドしたいと思うでしょう。

  3. ソケットをlocalhostにのみバインドしたい場合は、次のような構文になります。 my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1"); を呼び出すと bind(my_socket, (SOCKADDR *) &my_sockaddr, ...) .

  4. たまたまです。 INADDR_ANY は、たまたま"zero"に等しい定数です。

    http://www.castaglia.org/proftpd/doc/devel-guide/src/include/inet.h.html

    # define INADDR_ANY ((unsigned long int) 0x00000000)
    ...
    # define INADDR_NONE    0xffffffff
    ...
    # define INPORT_ANY 0
    ...
    
    
  5. もしまだよく知らないなら、Beej's Guide to Sockets Programmingをぜひチェックしてみてください。

    http://beej.us/guide/bgnet/

まだこれを読んでいる人がいるので、追加メモ。

男 (7) ip :

あるプロセスが新しい着信パケットや接続を受け取りたいとき。 を使用して、ローカル・インターフェイス・アドレスにソケットをバインドする必要があります。 バインド(2) .

この場合、1つのIPソケットを任意のローカル (アドレス、ポート)のペアを使用します。 バインドコールにINADDR_ANYが指定された場合。 ソケットはすべてのローカルインターフェイスにバインドされます。

という場合 リッスン(2) が呼び出されると、そのソケットは 自動的にランダムな空きポートにバインドされ、ローカルアドレスは を INADDR_ANY に設定します。

いつ 接続(2) を呼び出すと、そのソケットは 自動的にランダムな空きポートまたは使用可能な共有ポートにバインドされます。 ローカルアドレスをINADDR_ANYに設定し...

特殊なアドレスがいくつかあります。inaddr_loopback (127.0.0.1) は常にループバックデバイスを経由してローカルホストを参照し、INADDR_ANY (0.0.0.0)はバインディングのための任意のアドレスという意味です...

また

bind() - 名前と ソケット :

(sin_addr.s_addr)フィールドに定数INADDR_ANYを設定すると netinet/in.hで定義されているように、呼び出し元はソケットの作成を要求しています。 をホスト上のすべてのネットワークインタフェースにバインドする。その後、UDPパケット バインドされた名前に一致する)すべてのインターフェイスからの はアプリケーションにルーティングされます。これは、サーバーが以下のような場合に重要になります。 は、複数のネットワークに対してサービスを提供しています。アドレスを指定しないことで を指定しない場合、サーバーはすべてのUDPパケットとTCP接続を受け入れることができます。 そのポートに対して行われたリクエストは、ネットワーク・インターフェイスに関係なく が到着した。