私はいくつかのソケットをプログラムしようとしているので、サーバー側ではを使用しますhtonl(INADDR_ANY)
。私が理解している限りでは、この関数はランダムなIPを生成しているように見えます(私は正しいですか?)。実際、ソケットをにバインドしたいと思いlocalhost
ます。しかし、これを実行すると
printf("%d",htonl(INADDR_ANY));
戻り値として0を取得します。誰かが説明を持ってくることができますか?
私はいくつかのソケットをプログラムしようとしているので、サーバー側ではを使用しますhtonl(INADDR_ANY)
。私が理解している限りでは、この関数はランダムなIPを生成しているように見えます(私は正しいですか?)。実際、ソケットをにバインドしたいと思いlocalhost
ます。しかし、これを実行すると
printf("%d",htonl(INADDR_ANY));
戻り値として0を取得します。誰かが説明を持ってくることができますか?
回答:
bind()
ofINADDR_ANY
は「ランダムIPを生成」しません。ソケットを使用可能なすべてのインターフェースにバインドします。
サーバーの場合、通常、「localhost」だけでなく、すべてのインターフェースにバインドする必要があります。
ソケットをローカルホストのみにバインドする場合、構文は次のようmy_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1");
になりますbind(my_socket, (SOCKADDR *) &my_sockaddr, ...)
。次に、を呼び出します。
たまたまINADDR_ANY
「ゼロ」に等しい定数です。
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
...
まだ慣れていない場合は、Beejのソケットプログラミングガイドを確認することをお勧めします。
人々はまだこれを読んでいるので、追加の注意:
プロセスが新しい着信パケットまたは接続を受信する場合は、bind(2)を使用してソケットをローカルインターフェイスアドレスにバインドする必要があります。
この場合、特定のローカル(アドレス、ポート)ペアにバインドできるIPソケットは1つだけです。バインド呼び出しでINADDR_ANYが指定されている場合、ソケットはすべてのローカルインターフェイスにバインドされます。
ときに(2)を聞くソケットが自動的にINADDR_ANYへのローカルアドレスを設定して、ランダムな空きポートにバインドされ、結合していないソケットに対して呼ばれます。
とき(2)接続バインドされていないソケットで呼び出され、ソケットは自動的にランダム空きポートまたはINADDR_ANYにローカルアドレスが設定された使用可能な共有ポートにバインドされています...
いくつかの特別なアドレスがあります。INADDR_LOOPBACK(127.0.0.1)は、常にループバックデバイスを介してローカルホストを参照します。INADDR_ANY(0.0.0.0)は、バインド用の任意のアドレスを意味します。
また:
netinet / in.hで定義されているように、(sin_addr.s_addr)フィールドが定数INADDR_ANYに設定されている場合、呼び出し元は、ソケットがホスト上のすべてのネットワークインターフェイスにバインドされることを要求しています。その後、すべてのインターフェイス(バインドされた名前と一致する)からのUDPパケットとTCP接続がアプリケーションにルーティングされます。これは、サーバーが複数のネットワークにサービスを提供する場合に重要になります。アドレスを指定しないままにすることで、サーバーは、要求が到着したネットワークインターフェイスに関係なく、そのポートに対して行われたすべてのUDPパケットとTCP接続要求を受け入れることができます。
INADDR_LOOPBACK
、代わりに、を使用できませんinet_addr("127.0.0.1")
か?
バインドとソケットlocalhostを呼び出します前に、バインド機能、sockaddr_in構造体のsin_addr.s_addrフィールドが適切に設定する必要があります。適切な値は、次のいずれかによって取得できます。
my_sockaddress.sin_addr.s_addr = inet_addr("127.0.0.1")
またはによって
my_sockaddress.sin_addr.s_addr=htonl(INADDR_LOOPBACK);
INADDR_ANY
使用可能なすべてのインターフェースにバインドするようにリスニングソケットに指示します。にバインドしようとするのと同じinet_addr("0.0.0.0")
です。完全を期すために、IPv6にはIN6ADDR_ANY_INITもあり::
、IPv6ソケットのアドレスにバインドしようとするのと同じです。
#include <netinet/in.h>
struct in6_addr addr = IN6ADDR_ANY_INIT;
また、IPv6ソケットをIN6ADDR_ANY_INIT
ソケットにバインドすると、すべてのIPv6インターフェイスにバインドされ、IPv4クライアントからの接続も受け入れることができるはずです(ただし、IPv6にマップされたアドレス)。
htonl(INADDR_ANY)
。ドキュメントには、この関数がランダムIPを生成すると書かれています... "これは正しくありません。どのドキュメントがそう言っていますか?