こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

WinSockのクライアント処理

WinSockについてお尋ねしたいのですが、
クライアントからのサーバへ1頁分のデータを要求しそれを画面に表示する
プログラムを作成していますが、
一ページ分の要求毎に、以下の一連の処理を行っています。
WSAStartup
socket
connect
send
recv
closesocket
WSACleanup

この為か、netstrtで確認すると"TIME_WAIT"が多数発生しポートが
あふれてしまう事があります。

そこで、私は、
WSAStartupとWSACleanup
を、クライアント起動時に行う。
(いろいろ調べると、これは絶対修正すべきという事がわかりました。)
もうひとつ、
"TIME_WAIT"への対処として、
socket connect
も、クライアント起動時に行う事を考えています。

私の考えは適切なのでしょうか?

"TIME_WAIT"への一般的な対処などお教えください。
宜しくお願いいたします。

投稿日時 - 2005-03-09 14:42:22

QNo.1259463

暇なときに回答ください

質問者が選んだベストアンサー

質問の内容から、
・クライアントプログラムは常に動いている。
・リクエストがあったら、サーバに要求電文をsendする
・サーバからの電文をrecvして表示する
と判断します。

この場合、
>私の考えは適切なのでしょうか?
私ならNoです。

その前に、
>"TIME_WAIT"が多数発生しポートが
>あふれてしまう事があります。
これは???です。

手順で気になったのは
recvはデータを全部受信できるまでしていますか?
サーバ側が1回のsendであってもクライアントでは複数回のrecvが必要となる場合もあります。
全部受信していないのにcloseしちゃうのでTIME-WAITが発生しているのではありませんか?
(このあたりはあまり詳しくありません)

あとは、
closesocketの前にshutdownするべきだと思います。



話を戻します。
socketは良いとしてもconnectはダメだと思われます。
サーバが動いていない場合がありますので。。
またsendでエラーになったときは、shutdown/closesocketをしますので、
そうするとsocketとconnectは同じループ内でやるのがスジだと思います。

投稿日時 - 2005-03-10 01:06:50

お礼

有難うございます。
>そうするとsocketとconnectは同じループ内でやるのがスジだと思います。
やはりそうですか。
また、色々調べた所、あるクライアントが通信中のソケットを別のクライアントがcloseしてしまい、
ソケットが通信中のまま残ってしまう事が原因と分かりました。

又宜しくお願いします。

投稿日時 - 2005-03-10 22:43:20

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問