下記のsoketのつづきになってしまうのですが・・・ – プログラミング – Home

下記のsoketのつづきになってしまう...
 
通知
すべてクリア

[解決済] 下記のsoketのつづきになってしまうのですが・・・


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

すいません。解決しなかったものでもう一度書き込みさせていただきます。

クライアント側

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

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
 snow
(@snow)
ゲスト
結合: 23年前
投稿: 30
Topic starter  

>canto
FD_SETSIZE以外の場合、何を設定すればよいのでしょうか?

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

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


返信引用
canto
 canto
(@canto)
ゲスト
結合: 23年前
投稿: 5
 

無視されるのですから、int型であれば何でもいいような気もしますが・・・。

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

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


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

>canto

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

もう少し勉強致します。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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