Socket

切断

切断時に shutdown() の第2引数にSD_BOTHを指定した場合、自身の処理には何の影響もありませんが、接続相手側でエラーが発生します。

 

これはいきなり一方的に切断処理を行うためであり、親切な方法ではないからです。

ということで、お行儀の良い切断処理方法について。

 

 

まず送信側を無効にし、受信バッファに残っているデータを全て読み込みます。

その後、受信側も無効にしてソケットを閉じます。

シャットダウン処理を送信側/受信側で個別に行うだけです。

DWORD CClientSock::Disconnect()
{
	int		sockRet = 0;
	DWORD	ret = SOCK_SUCCESS;



	ret = shutdown(m_sock, SD_SEND);
	while(TRUE)
	{
		CHAR	buff[4096];


		ret = recv(m_sock, buff, sizeof(buff), 0);
		if( (ret == SOCKET_ERROR) || (ret == 0) )
		{
			break;
		}
	}
	ret = shutdown(m_sock, SD_BOTH);
	closesocket(m_sock);


	return ret;
}