クライアントのソケットの作成
初期化後、クライアントで使用するために SOCKET オブジェクトをインスタンス化する必要があります。
ソケットを作成するには
sockaddr 構造体を含む addrinfo オブジェクトを宣言し、これらの値を初期化します。 このアプリケーションでは、IPv6 アドレスまたは IPv4 アドレスを返すことができるように、インターネット アドレス ファミリは指定されていません。 アプリケーションは、TCP プロトコルのストリーム ソケットとしてソケットの種類を要求します。
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;
コマンド ラインで渡されたサーバー名の IP アドレスを要求する getaddrinfo 関数を呼び出します。 クライアントが接続するサーバー上の TCP ポートは、このサンプルでは DEFAULT_PORT によって 27015 として定義されています。 getaddrinfo 関数は、エラーをチェックする整数として値を返します。
#define DEFAULT_PORT "27015" // Resolve the server address and port iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }
ConnectSocket という名前の SOCKET オブジェクトを作成します。
SOCKET ConnectSocket = INVALID_SOCKET;
ソケット関数を呼び出し、その値を ConnectSocket 変数に返します。 このアプリケーションでは、hints パラメーターで指定されたアドレス ファミリ、ソケットの種類、プロトコルに一致する getaddrinfo の呼び出しによって返される最初の IP アドレスを使用します。 この例では、TCP ストリーム ソケットは、ソケットの種類が SOCK_STREAM で、プロトコルが IPPROTO_TCP で指定されています。 アドレス ファミリは未指定のまま (AF_UNSPEC)、返される IP アドレスは、サーバーの IPv6 または IPv4 アドレスのいずれかになります。
クライアント アプリケーションが IPv6 または IPv4 のみを使用して接続する場合は、アドレス ファミリを 、iPv6 の場合は AF_INET6 に設定するか、hints パラメーターで IPv4 用にAF_INETに設定する必要があります。
// Attempt to connect to the first address returned by // the call to getaddrinfo ptr=result; // Create a SOCKET for connecting to server ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
エラーを調べて、ソケットが有効なソケットであることを確認します。
if (ConnectSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
ソケット関数に渡されるパラメーターは、実装ごとに変更できます。
エラー検出は、成功したネットワーク コードの重要な部分です。 ソケット呼び出しが失敗すると、INVALID_SOCKETが返されます。 前のコードの if ステートメントは、ソケットの作成時に発生した可能性のあるエラーをキャッチするために使用されます。 WSAGetLastError は 、発生した最後のエラーに関連付けられたエラー番号を返します。
注意
アプリケーションによっては、より広範なエラー チェックが必要になる場合があります。
たとえば、 hints.ai_family を AF_UNSPEC に設定すると、接続呼び出しが失敗する可能性があります。 その場合は、代わりに特定の IPv4 (AF_INET) または IPv6 (AF_INET6) 値を使用します。
WSACleanup は、WS2_32 DLL の使用を終了するために使用されます。
次の手順: ソケットへの接続
関連トピック