- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VC6.0ソケット通信プログラムについて)
VC6.0ソケット通信プログラムの改善方法とは?
このQ&Aのポイント
- VC6.0でソケット通信の社内の既存のプログラムを改善しております。クライアントより、サーバにソケットで大量に電文を送信した時に、サーバ側の処理が重くなってしまいます。
- サーバ側では、CLOSE_WAITが大量に出力されておりクライアント側では、FIN_WAIT_2が大量に出力されます。クライアント側のFIN_WAIT_2は、時間が経つと消えるのですが、サーバ側のCLOSE_WAITは残ってしまっております。サーバ側のソケットの受信後の処理に問題があるのではと考えておりますが、何処が問題なのかわからない状態です。
- ソケット通信プログラムの改善方法に関してご教授いただけると幸いです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
waitReceiveThread()においてrecv()の戻り値rcvSizeが0以下の場合、そのコネクションは切断された物として処理するのが妥当だと思います。origin_93様の書かれたプログラムでは無理やりcontinueしてrecv()を繰り返しいるため、切断後の正常動作は期待出来ません。 かなり大雑把ですが、一般的なサーバの動作は下記の流れの様になります。 while (TRUE) { socket(); bind(); listen(); while (TRUE) { accept(); while (TRUE) { ret = recv(); if (ret <= 0) break; else { 受信処理 } } } } 一番外側のループは要らないかもしれませんが、socket()等の戻り値がエラーだった場合を考慮しています。 複数のクライアントが接続するならば、acceptの後で受信スレッドを生成し、そのままループします。acceptで取得したレシーブソケットは受信処理のループを抜けた所でクローズして構いません。
お礼
上記コードに、内側のループをbreakし、acceptする前にclose処理を入れてで作成したところ、問題なく動作しました。 誠にありがとうございました。