shutdown 関数 (winsock.h)

シャットダウン関数は、ソケットでの送受信を無効にします。

構文

int shutdown(
  [in] SOCKET s,
  [in] int    how
);

パラメーター

[in] s

ソケットを識別する記述子。

[in] how

許可されなくなる操作の種類を示すフラグ。 このフラグに使用できる値は、 Winsock2.h ヘッダー ファイルに一覧表示されます。

意味
SD_RECEIVE
0
シャットダウン受信操作。
SD_SEND
1
送信操作をシャットダウンします。
SD_BOTH
2
送受信操作の両方をシャットダウンします。

戻り値

エラーが発生しない場合、 シャットダウン は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、 WSAGetLastError を呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSAECONNABORTED
仮想回線はタイムアウトまたはその他の障害のために切断されました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。

このエラーは、接続指向ソケットにのみ適用されます。

WSAECONNRESET
強制終了または中止になる閉じる操作を実行するリモート側によって仮想回線がリセットされました。 ソケットが使用できないため、アプリケーションはソケットを閉じる必要があります。

このエラーは、接続指向ソケットにのみ適用されます。

WSAEINPROGRESS
ブロックしている Windows ソケット 1.1 呼び出しが進行中であるか、サービス プロバイダーがコールバック関数を処理しています。
WSAEINVAL
パラメーターが無効であるか、ソケットの種類と一致していません。 たとえば、SD_SENDは、UNI_RECVソケット型で使用されます。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENOTCONN
ソケットは接続されていません。 このエラーは、接続指向ソケットにのみ適用されます。
WSAENOTSOCK
メモ 記述子はソケットではありません。
 
WSANOTINITIALIZED
この関数を使用する前に 、WSAStartup 呼び出しが正常に行われる必要があります。

注釈

シャットダウン機能は、受信、送信、またはその両方を無効にするために、すべてのタイプのソケットで使用されます。

パラメーターがどのようにSD_RECEIVEされている場合、ソケット上の recv 関数の後続の呼び出しは許可されません。 これは、下位のプロトコル レイヤーには影響しません。 TCP ソケットの場合、受け取りを待機しているソケットにまだデータがキューに入っている場合、またはデータが後続に到着した場合、データをユーザーに配信できないため、接続はリセットされます。 UDP ソケットの場合、受信データグラムが受け入れられ、キューに入れられます。 いずれの場合も、ICMP エラー パケットが生成されません。

パラメーターがどのようにSD_SENDされている場合、その後の send 関数の呼び出しは許可されません。 TCP ソケットの場合、すべてのデータが受信側によって送信および受信確認された後に FIN が送信されます。

SD_BOTH 方法 を設定すると、上記のように送受信の両方が無効になります。

シャットダウン関数はソケットを閉じません。 ソケットに接続されているリソースは、 closesocket が呼び出されるまで解放されません。

閉じる前にすべてのデータが接続されたソケットで送受信されるようにするには、アプリケーションで closesocket を呼び出す前にシャットダウンを使用して接続を閉じる必要があります。 リモート エンドがすべてのデータを送信し、正常な切断を開始したことを示す通知を待機する 1 つの方法では、 次のように WSAEventSelect 関数を使用します。

  1. WSAEventSelect を呼び出して、FD_CLOSE通知に登録します。
  2. how=SD_SEND を使用してシャットダウンを呼び出します。
  3. FD_CLOSE受信したら、関数が成功して完了し、0 バイトが受信されたことを示すまで 、recv または WSARecv を呼び出します。 SOCKET_ERRORが返された場合、正常な切断はできません。
  4. closesocket を呼び出します。
リモート エンドがすべてのデータを送信し、正常な切断を開始したことを示す通知を待機する別の方法では、次に示す重複する受信呼び出しが使用されます。
  1. how=SD_SEND を使用してシャットダウンを呼び出します。
  2. 関数が成功して完了し、0 バイトが受信されたことを示すまで、 recv または WSARecv を呼び出します。 SOCKET_ERRORが返された場合、正常な切断はできません。
  3. closesocket を呼び出します。
メモシャットダウン関数は、ソケットのSO_LINGER設定に関係なくブロックしません。
 

詳細については、「 グレースフル シャットダウン」、「残留オプション」、「ソケット クロージャ」のセクションを参照してください。

シャットダウン関数を呼び出して送信、受信、またはその両方を無効にすると、既存のソケット接続の送受信を再度有効にする方法はありません。

アプリケーションは、シャットダウン後にソケットを再利用できることに依存しないようにする必要があります。 特に、シャットダウンされたソケットでの 接続 の使用をサポートするために、Windows ソケット プロバイダーは必要ありません。

アプリケーションがソケットを再利用する場合は、dwFlags パラメーターを TF_REUSE_SOCKET に設定して DisconnectEx 関数を呼び出して、ソケット上の接続を閉じ、ソケット ハンドルを再利用する準備を行う必要があります。 DisconnectEx 要求が完了すると、ソケット ハンドルを AcceptEx または ConnectEx 関数に渡すことができます。

アプリケーションでソケットを再利用する場合は、dwFlags パラメーターを TF_DISCONNECT と共に設定して TransmitFile または TransmitPackets 関数を呼び出し、すべてのデータ送信キューに登録された後に切断し、再利用するソケット ハンドルを準備TF_REUSE_SOCKET。 TransmitFile 要求が完了すると、AcceptExConnectEx などの接続を確立するために以前に使用した関数呼び出しにソケット ハンドルを渡すことができます。 TransmitPackets 関数が完了すると、ソケット ハンドルを AcceptEx 関数に渡すことができます。

メモ ソケット レベルの切断は、基になるトランスポートの動作の対象となります。 たとえば、TCP ソケットは TCP TIME_WAIT状態の影響を受け、 DisconnectExTransmitFile、または TransmitPackets の呼び出しが遅延する可能性があります。
 
メモシャットダウンなどのブロッキング Winsock 呼び出しを発行する場合、Winsock は、呼び出しが完了する前にネットワーク イベントを待機する必要がある場合があります。 Winsock は、この状況でアラート可能な待機を実行します。この待機は、同じスレッドでスケジュールされた非同期プロシージャ 呼び出し (APC) によって中断される可能性があります。 同じスレッドで進行中の Winsock 呼び出しを中断した APC 内で別のブロック Winsock 呼び出しを発行すると、未定義の動作が発生し、Winsock クライアントが試行することはできません。
 

ATMに関する注意事項

非同期転送モード (ATM) と Windows ソケット 2 を使用する場合、接続の破棄に関連する重要な問題があります。 これらの重要な考慮事項の詳細については、 closesocket 関数リファレンスの「備考」セクションの「ATM の注意事項」セクションを参照してください。

Windows Phone 8: この関数は、Windows Phone 8 以降のWindows Phone ストア アプリでサポートされています。

Windows 8.1Windows 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

こちらもご覧ください

AcceptEx

ConnectEx

DisconnectEx

TransmitFile

TransmitPackets

WSAEventSelect

Winsock 関数

Winsock リファレンス

connect

socket