下記のsoketのつづきになってしまうのですが・・・

[戻る]
snow 2002/09/20(金) 15:36:04
すいません。解決しなかったものでもう一度書き込みさせていただきます。

クライアント側

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()のあとに切断しても、結局はサーバ側では切断と判断するのでは
ないのでしょうか?勉強不足ですいません。詳しく教えてください。
それとも、処理の書き方が間違っているのでしょうか?

canto 2002/09/20(金) 18:27:45
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をいきなり持ってくるのは変です。

snow 2002/09/20(金) 19:11:32
>canto
FD_SETSIZE以外の場合、何を設定すればよいのでしょうか?

また、recv()の前で、FD_ISSET(s[i], &readfds)としているのですが、
これは何か関係あるのでしょうか?

すいませんが、もう少し詳しく教えて下さい。

canto 2002/09/21(土) 00:15:12
無視されるのですから、int型であれば何でもいいような気もしますが・・・。

それから、recv()の前で、FD_ISSET(s[i], &readfds)としているようですが、
これは何か関係あるのでしょうか?との質問ですが、上記のソースでは、どこで
listenして、どこでacceptしているのかわからないので、なんとも言えません。
(普通は、select()をswitchで条件判断して、FD_ISSETしてから、accept()
しますが・・・)

また、Windowsでは、そもそも、select()を使用することは推奨されていません。
非同期モードであれば、WSAAsyncSelect()をできるだけ使用してください。

snow 2002/09/24(火) 11:44:59
[[解決]]
>canto

たびたびありがとうございました。
またわからないところがあったらレスしますので、
よろしくお願いします。

もう少し勉強致します。

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