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
です。
>"ABCDEFGHIJK\r\n"
>と言う文字列を送信したとすると
>サーバ側では
>13バイト受信するんですか?
strlen()で送信サイズを決めているとしたら13バイトです。
>\nのあとにもう1バイト受信しないと
>ダメだと思うのですか間違ってますか?
ん?文字処理ではないので、必ずしもNULLを待つ必要は無い。
>"\r\n"がでたらrecvを呼ぶ関数を終了するように設計されています。
だったらきちんと動くはずだが。
ioctlsocket()でFIONREAD を使うと読み込みバッファの有効データ数が
わかります。
#書き込みバッファの空きバイト数がわかる関数、どこかにないかしら。
selectの部分を(面倒くさいから)無視してコメントしたのだが、
FD_ZERO、FD_SET、FD_ISSETは適切につかってますか?
よう (;´Д`)y-~~ 咳が止まんねーぞクソが
「ブロッキングソケット」「ノンブロッキングソケット」な。
つーか答え書くが
u_long arg = (u_long)TRUE;
ioctlsocket(sock, FIONBIO, &arg);
な。
あと,俺みてーなクソッタレはたまに悪意ある嘘をついて楽しむわけだが
どうするよ?へへへ。
ツイート | ![]() |