サーバーのソケットの作成
初期化後、サーバーで使用するために SOCKET オブジェクトをインスタンス化する必要があります。
サーバーのソケットを作成するには
getaddrinfo 関数は、sockaddr 構造体の値を決定するために使用されます。
- AF_INET は、IPv4 アドレス ファミリを指定するために使用されます。
- SOCK_STREAM は、ストリーム ソケットを指定するために使用されます。
- IPPROTO_TCP は、TCP プロトコル を指定するために使用されます。
- AI_PASSIVE フラグは、呼び出し元が バインド 関数の呼び出しで返されたソケット アドレス構造を使用することを示します。 AI_PASSIVE フラグが設定され、nodename パラメーターが getaddrinfo 関数に NULL ポインターである場合、ソケット アドレス構造体の IP アドレス部分は、IPv4 アドレスの場合はINADDR_ANYに設定され、IPv6 アドレスの場合はIN6ADDR_ANY_INITに設定されます。
- 27015 は、クライアントが接続するサーバーに関連付けられているポート番号です。
addrinfo 構造体は、getaddrinfo 関数によって使用されます。
#define DEFAULT_PORT "27015" struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof (hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the local address and port to be used by the server iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }
サーバー がクライアント 接続をリッスンするための ListenSocket という SOCKET オブジェクトを作成します。
SOCKET ListenSocket = INVALID_SOCKET;
ソケット関数を呼び出し、その値を ListenSocket 変数に返します。 このサーバー アプリケーションでは、hints パラメーターで指定されたアドレス ファミリ、ソケットの種類、プロトコルに一致する getaddrinfo の呼び出しによって返される最初の IP アドレスを使用します。 この例では、IPv4 の TCP ストリーム ソケットが、IPv4 のアドレス ファミリ、SOCK_STREAMのソケットの種類、およびIPPROTO_TCPのプロトコルを使用して要求されました。 そのため、ListenSocket には IPv4 アドレスが要求されます。
サーバー アプリケーションが IPv6 でリッスンする場合は、アドレス ファミリを hints パラメーターでAF_INET6に設定する必要があります。 サーバーが IPv6 と IPv4 の両方でリッスンする場合は、IPv6 用と IPv4 用の 2 つのリッスン ソケットを作成する必要があります。 これら 2 つのソケットは、アプリケーションによって個別に処理される必要があります。
Windows Vista 以降では、IPv6 と IPv4 の両方でリッスンするデュアル スタック モードの単一の IPv6 ソケットを作成できます。 この機能の詳細については、「 デュアルスタック ソケット」を参照してください。
// Create a SOCKET for the server to listen for client connections ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
エラーを調べて、ソケットが有効なソケットであることを確認します。
if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
次の手順: ソケットのバインド
関連トピック