すいません。解決しなかったものでもう一度書き込みさせていただきます。
クライアント側
socket 作成
connect 接続
send メッセージ送信
shutdown()
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
{
切断
}
クライアント側でshutdown()をしてclosesocketをしているのですが、
サーバー側では、やはり受信エラーの処理に走ってしまいます。
やはりサーバ側では、この中で、WSAGetLastErrorのエラーコードを判別して
ソケットが切断されたのか判断するしかないのでしょうか?
クライアント側で、send()の後にrecv()をきっちりすると、サーバ側では
切断の処理に走ります。クライアント側で、send()だけしてソケットを切断しても
send() recv()のあとに切断しても、結局はサーバ側では切断と判断するのでは
ないのでしょうか?勉強不足ですいません。詳しく教えてください。
それとも、処理の書き方が間違っているのでしょうか?
select(FD_SETSIZE, &readfds, NULL, NULL, NULL)
は、まずいと思います。ヘルプではselectは
int select (
int nfds,
fd_set FAR * readfds,
fd_set FAR * writefds,
fd_set FAR * exceptfds,
const struct timeval FAR * timeout
);
Parameters
nfds
[in] This parameter is ignored; it is included only for compatibility with
Berkeley sockets.
と書かれていますので、FD_SETSIZEをいきなり持ってくるのは変です。
>canto
FD_SETSIZE以外の場合、何を設定すればよいのでしょうか?
また、recv()の前で、FD_ISSET(s[i], &readfds)としているのですが、
これは何か関係あるのでしょうか?
すいませんが、もう少し詳しく教えて下さい。
無視されるのですから、int型であれば何でもいいような気もしますが・・・。
それから、recv()の前で、FD_ISSET(s[i], &readfds)としているようですが、
これは何か関係あるのでしょうか?との質問ですが、上記のソースでは、どこで
listenして、どこでacceptしているのかわからないので、なんとも言えません。
(普通は、select()をswitchで条件判断して、FD_ISSETしてから、accept()
しますが・・・)
また、Windowsでは、そもそも、select()を使用することは推奨されていません。
非同期モードであれば、WSAAsyncSelect()をできるだけ使用してください。
>canto
たびたびありがとうございました。
またわからないところがあったらレスしますので、
よろしくお願いします。
もう少し勉強致します。