ソケット通信でタイムアウトするには?


cocomo  2005-01-15 05:25:09  No: 56014

cocomoです。

もともとLinuxで動いていたものをVC++.NET
へのコンバージョン作業をしています。

ソケット通信の処理を行っていますが
うまくいかないところがあるので宜しくお願いします。

クライアント側から
send処理を1回送信しています。

サーバ側では以下の処理しています。

while(1){
  iRet = select( 0, &fdsRead, NULL, NULL, ptTimeOut );
  if ( iRet == 0 ){
    Sleep( 2000 ) ;
    continue;
  }
  else if( iRet < 0 ){
    Sleep( 2000 ) ;
    continue;
  }

  recvをする関数を呼んでいます。
  Sleep( 300 ) ;
}

クライアントからsendする前はselectの戻り値が0になって
いて正常です。
クライアントからsendするとselectの戻り値が1以上になって
recvをする関数を呼んでいます。
recvする関数を呼んで処理した後
また、select関数がよばれたとき
selectの戻り値が1以上になっていて
recvが呼ばれたときに固まってしまいます。
recvした後に何か処理が必要なんでしょうか?

現状の受信関数はrecvで1バイトずつ受信して
"\r\n"がでたらrecvを呼ぶ関数を終了するように設計されています。

たとえばクライアント側で
"ABCDEFGHIJK\r\n"
と言う文字列を送信したとすると
サーバ側では
13バイト受信するんですか?
\nのあとにもう1バイト受信しないと
ダメだと思うのですか間違ってますか?

どなたか宜しくお願いします。

開発環境は
Windows2000
VC++ .NET 2003
です。


ボコノン教徒  2005-01-18 00:44:03  No: 56015

>"ABCDEFGHIJK\r\n"
>と言う文字列を送信したとすると
>サーバ側では
>13バイト受信するんですか?

strlen()で送信サイズを決めているとしたら13バイトです。

>\nのあとにもう1バイト受信しないと
>ダメだと思うのですか間違ってますか?

ん?文字処理ではないので、必ずしもNULLを待つ必要は無い。

>"\r\n"がでたらrecvを呼ぶ関数を終了するように設計されています。

だったらきちんと動くはずだが。

ioctlsocket()でFIONREAD を使うと読み込みバッファの有効データ数が
わかります。

#書き込みバッファの空きバイト数がわかる関数、どこかにないかしら。


ボコノン教徒  2005-01-18 01:16:24  No: 56016

selectの部分を(面倒くさいから)無視してコメントしたのだが、
FD_ZERO、FD_SET、FD_ISSETは適切につかってますか?


(noname)  2005-01-18 10:22:05  No: 56017

よう (;´Д`)y-~~ 咳が止まんねーぞクソが

「ブロッキングソケット」「ノンブロッキングソケット」な。
つーか答え書くが
  u_long arg = (u_long)TRUE;
  ioctlsocket(sock, FIONBIO, &arg);
な。

あと,俺みてーなクソッタレはたまに悪意ある嘘をついて楽しむわけだが
どうするよ?へへへ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加