socket通信の考え方について – プログラミング – Home

socket通信の考え方について
 
通知
すべてクリア

[解決済] socket通信の考え方について


snow
 snow
(@snow)
ゲスト
結合: 23年前
投稿: 30
Topic starter  

ソケット通信を行いたいのですが、

クライアント側

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
 canto
(@canto)
ゲスト
結合: 23年前
投稿: 5
 

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

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


返信引用
snow
 snow
(@snow)
ゲスト
結合: 23年前
投稿: 30
Topic starter  

>canto

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

でやってみます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました