1

getaddrinfo を使用して、localhost でのみ接続を受け入れるローカル サーバーを起動しています。

struct addrinfo *res;
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
getaddrinfo(NULL, portbuf, &hints, &res);

これは問題なく動作するようで、IPv6 が存在する場合は IPv6 アドレス ::1 が、存在しない場合は IPv4 アドレスが返されます。
ときどき Windows 2008 R2 を除いて (少なくとも私が見た唯一のシステムですが、顧客のシステムで 2 回見ました)、IPv6 ではなく 127.0.0.1 にバインドされます!
::1 をバインドすると 127.1 と ::1 の両方の接続を受け入れるため、これは私を混乱させますが、127.1 をバインドすると IPv6 接続は受け入れられません。

4

1 に答える 1

3

getaddrinfo()不特定の順序で、一致するアドレスのリストを返します。リストを (ai_nextポインターに従って) トラバースし、返された各アドレスにバインドされたリッスン ソケットを作成する必要があります。

于 2010-08-13T04:23:59.047 に答える