socket通信の考え方について

[戻る]
snow 2002/09/19(木) 18:34:54
ソケット通信を行いたいのですが、

クライアント側

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、もしくは他の処理に問題があるのでしょうか?
教えてください。

canto 2002/09/19(木) 23:53:18
接続型アプリケーションでは、ソケット接続を行儀よく
閉じるため、shutdown()を使用し、サーバーに終了した
ことを通知しないといけないと思うのですが・・・。

WSAGetLastErrorでエラーコードを見ると、10053だと
言うことは、WSAECONNABORTED、つまり、ソフトウェア
によって接続が中断されたということだから、やっぱり、
shutdown()を使用したほうがいいと思います。

snow 2002/09/20(金) 13:34:53
[[解決]]
>canto

ありがとうございました。
shutdown()
closesocket()

でやってみます。

勉強不足のためshutdown()の存在自体知りませんでした。

古いスレッドには追加発言できません。