shutdown 関数 (winsock.h)
シャットダウン関数は、ソケットでの送受信を無効にします。
構文
int shutdown(
[in] SOCKET s,
[in] int how
);
パラメーター
[in] s
ソケットを識別する記述子。
[in] how
許可されなくなる操作の種類を示すフラグ。 このフラグに使用できる値は、 Winsock2.h ヘッダー ファイルに一覧表示されます。
値 | 意味 |
---|---|
|
シャットダウン受信操作。 |
|
送信操作をシャットダウンします。 |
|
送受信操作の両方をシャットダウンします。 |
戻り値
エラーが発生しない場合、 シャットダウン は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。
エラー コード | 意味 |
---|---|
仮想回線はタイムアウトまたはその他の障害のために切断されました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。
このエラーは、接続指向ソケットにのみ適用されます。 |
|
強制終了または中止になる閉じる操作を実行するリモート側によって仮想回線がリセットされました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。
このエラーは、接続指向ソケットにのみ適用されます。 |
|
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。 | |
パラメーターが無効であるか、ソケットの種類と一致していません。 たとえば、SD_SENDは、UNI_RECVソケット型で使用されます。 | |
ネットワーク サブシステムが失敗しました。 | |
ソケットは接続されていません。 このエラーは、接続指向ソケットにのみ適用されます。 | |
メモ 記述子はソケットではありません。
|
|
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。 |
注釈
シャットダウン機能は、受信、送信、またはその両方を無効にするために、すべてのタイプのソケットで使用されます。
パラメーターがどのようにSD_RECEIVEされている場合、ソケット上の recv 関数の後続の呼び出しは許可されません。 これは、下位のプロトコル レイヤーには影響しません。 TCP ソケットの場合、受け取りを待機しているソケットにまだデータがキューに入っている場合、またはデータが後続に到着した場合、データをユーザーに配信できないため、接続はリセットされます。 UDP ソケットの場合、受信データグラムが受け入れられ、キューに入れられます。 いずれの場合も、ICMP エラー パケットが生成されません。
パラメーターがどのようにSD_SENDされている場合、その後の send 関数の呼び出しは許可されません。 TCP ソケットの場合、すべてのデータが受信側によって送信および受信確認された後に FIN が送信されます。
SD_BOTH 方法 を設定すると、上記のように送受信の両方が無効になります。
シャットダウン関数はソケットを閉じません。 ソケットに接続されているリソースは、 closesocket が呼び出されるまで解放されません。
閉じる前にすべてのデータが接続されたソケットで送受信されるようにするには、アプリケーションで closesocket を呼び出す前にシャットダウンを使用して接続を閉じる必要があります。 リモート エンドがすべてのデータを送信し、正常な切断を開始したことを示す通知を待機する 1 つの方法では、 次のように WSAEventSelect 関数を使用します。
- WSAEventSelect を呼び出して、FD_CLOSE通知に登録します。
- how=SD_SEND を使用してシャットダウンを呼び出します。
- FD_CLOSE受信したら、関数が成功して完了し、0 バイトが受信されたことを示すまで 、recv または WSARecv を呼び出します。 SOCKET_ERRORが返された場合、正常な切断はできません。
- closesocket を呼び出します。
- how=SD_SEND を使用してシャットダウンを呼び出します。
- 関数が成功して完了し、0 バイトが受信されたことを示すまで、 recv または WSARecv を呼び出します。 SOCKET_ERRORが返された場合、正常な切断はできません。
- closesocket を呼び出します。
詳細については、「 グレースフル シャットダウン」、「残留オプション」、「ソケット クロージャ」のセクションを参照してください。
シャットダウン関数を呼び出して送信、受信、またはその両方を無効にすると、既存のソケット接続の送受信を再度有効にする方法はありません。
アプリケーションは、シャットダウン後にソケットを再利用できることに依存しないようにする必要があります。 特に、シャットダウンされたソケットでの 接続 の使用をサポートするために、Windows ソケット プロバイダーは必要ありません。
アプリケーションがソケットを再利用する場合は、dwFlags パラメーターを TF_REUSE_SOCKET に設定して DisconnectEx 関数を呼び出して、ソケット上の接続を閉じ、ソケット ハンドルを再利用する準備を行う必要があります。 DisconnectEx 要求が完了すると、ソケット ハンドルを AcceptEx または ConnectEx 関数に渡すことができます。
アプリケーションでソケットを再利用する場合は、dwFlags パラメーターを TF_DISCONNECT と共に設定して TransmitFile または TransmitPackets 関数を呼び出し、すべてのデータが送信キューに登録された後に切断し、再利用するソケット ハンドルを準備TF_REUSE_SOCKET。 TransmitFile 要求が完了すると、AcceptEx や ConnectEx などの接続を確立するために以前に使用した関数呼び出しにソケット ハンドルを渡すことができます。 TransmitPackets 関数が完了すると、ソケット ハンドルを AcceptEx 関数に渡すことができます。
ATMに関する注意事項
非同期転送モード (ATM) と Windows ソケット 2 を使用する場合、接続の破棄に関連する重要な問題があります。 これらの重要な考慮事項の詳細については、 closesocket 関数リファレンスの「備考」セクションの「ATM の注意事項」セクションを参照してください。Windows Phone 8: この関数は、Windows Phone 8 以降のWindows Phone ストア アプリでサポートされています。
Windows 8.1とWindows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8.1、 Windows Vista [デスクトップ アプリ |UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2003 [デスクトップ アプリのみ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | winsock.h (Winsock2.h、Webhost.h を含む) |
Library | Ws2_32.lib |
[DLL] | Ws2_32.dll |