クライアント接続を受け入れるサーバーのために、それは、システムの範囲内でネットワークアドレスに縛られていなければなりません。
以下のコードは、作成済みソケットをIPアドレスとポートに関連付ける方法を示します。
クライアントアプリケーションは、ホストネットワーク接続に、IPアドレスとポートを使います。
sockaddr構造体は、アドレスファミリィ、IPアドレス、そして、ポート番号、に関する情報を保持します、
ソケットをバインドしましょう。
-
getaddrinfo関数は、sockaddr構造体の値を決定するのに用いられます:
- AF_INETはIPv4アドレスファミリィを指定するのに使用されます。
- SOCK_STREAMはストリームソケットを指定するのに使用されます。
- IPPROTO_TCPはTCPプロトコルを指定するのに使用されます。
- AI_PASSIVEフラグは発信者がbind関数より戻されたソケットアドレス構造体を使用する予定である事を指定します。
AI_PASSIVEフラグがセットされ、getaddrinfo関数へのnodenameパラメタがNULLポインターであるとき、
ソケットアドレス構造体のIPアドレス部分は、IPv4アドレスのためにINADDR_ANYに、または、IPv6のためにIN6ADDR_ANY_INITにセットされます。
- 27015はクライアントが接続するサーバーと関連するポート番号です。
#define DEFAULT_PORT "27015"
struct addrinfo *result = NULL,
hints;
int iResult;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
hints.ai_flags = AI_PASSIVE;
iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
if ( iResult != 0 )
{
printf("getaddrinfo failed: %d\n", iResult);
WSACleanup();
return 1;
}
- bind関数を呼出し、作成されたsocketと、getaddrinfo関数のパラメタとして戻されたsockaddr構造体を渡しましょう。
一般的なエラーをチェックしましょう。
iResult = bind( ListenSocket,
result->ai_addr, (int)result->ai_addrlen);
if (iResult == SOCKET_ERROR)
{
printf("bind failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ListenSocket);
WSACleanup();
return 1;
}
次のステップ: ソケットでのリスニング
|