ソケット通信を行いたいのですが、
クライアント側
socket 作成
connect 接続
send メッセージ送信
closesocket接続
とするとサーバ側で、ソケットが切断された事を認識してくれません。
サーバ側は
char ctmp[1024];
fd_set readfds
int ilen;
select(FD_SETSIZE, &readfds, NULL, NULL, NULL)
if( (ilen = recv(sok, ctmp, sizeof(ctmp), 0)) == SOCKET_ERROR )
{
error
}
else if( ilen != 0 )
{
メッセージ受信成功
}
else
{
切断
}
をループしています。
クライアント側でclosesocketするとサーバ側で、errorの処理に走ってしまいます。
WSAGetLastErrorでエラーコードを見ると、10053でした。
しかし、サーバ側に受信に成功した場合、即、送信の処理を追加し、
クライアント側に送信後、即、受信の処理を追加したところ、クライアントを切断後、
サーバ側は、切断の処理を走りました。
クライアント側
socket 作成
connect 接続
send メッセージ送信
recv メッセージ受信
closesocket接続
サーバ側は
char ctmp[1024];
fd_set readfds
int ilen;
select(FD_SETSIZE, &readfds, NULL, NULL, NULL)
if( (ilen = recv(sok, ctmp, sizeof(ctmp), 0)) == SOCKET_ERROR )
{
error
}
else if( ilen != 0 )
{
メッセージ受信成功
send メッセージ送信
}
else
{
切断
}
クライアント側では、送信と受信はペアと考えるのでしょうか?
それともselect、もしくは他の処理に問題があるのでしょうか?
教えてください。
接続型アプリケーションでは、ソケット接続を行儀よく
閉じるため、shutdown()を使用し、サーバーに終了した
ことを通知しないといけないと思うのですが・・・。
WSAGetLastErrorでエラーコードを見ると、10053だと
言うことは、WSAECONNABORTED、つまり、ソフトウェア
によって接続が中断されたということだから、やっぱり、
shutdown()を使用したほうがいいと思います。
>canto
ありがとうございました。
shutdown()
closesocket()
でやってみます。
勉強不足のためshutdown()の存在自体知りませんでした。