- - PR -
通信プログラムのハンドルリークについて
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-09-15 18:13
はじめまして、サーバ側通信プログラムを作成するにあたり、わからない事があり
質問させていただきます。 (開発言語:VB 2005 OS:Windows Server2003です。) (1)スレッドを作成し、各ポート毎に処理をする。 (2)Dim listener As New System.Net.Sockets.TcpListener(IPaddress, port_no) (3)listener.Start() (4)Dim client As System.Net.Sockets.TcpClient = listener.AcceptTcpClient() (5)Dim netWork As System.Net.Sockets.NetworkStream = client.GetStream() ・・・処理 (6)network.close (7)client.close (listener.stop->(2)へ 上記のコーディングにて (4)の状態でクライアント側から接続せず、放置した場合、タスクマネージャにてハンドル数が 徐々に増えていってしまいます。 ある程度増加した後に、クライアントより接続した場合、一旦ハンドル数は減少するのですが 元の値よりも幾分多きい値となっています。 何が原因であるか、分かる方いらっしゃいましたらご教授の程宜しくお願いします。 | ||||||||
|
投稿日時: 2007-09-15 18:54
個数はどのくらいですか? また、元の値より多くなってる期間はどのくらいまで確認しましたか? WinAPIを直接たたいていても、 内部のキャッシュなどでハンドル数は減らない場合もあります。 まして.Netですから、ある程度仕方ないです。 | ||||||||
|
投稿日時: 2007-09-15 19:05
こんにちは。
直接の回答ではないです。 なんだか私には違和感のあるプログラムですね。
1つのサービスで複数ポートを使用するということですか? 「接続要求毎にスレッドを作成して処理する」の間違いではないんですよね?
(8)から(2)に戻るって、1接続要求を処理したらまたポートを開きなおすってことですか? 保留中の接続要求はすべて失われてしまうと思うのですが。 (4)〜(7)のループではないのですか? | ||||||||
|
投稿日時: 2007-09-15 19:24
お返事頂きありがとうございます。
アプリケーションの処理内容についてですが、 1つのサービスで複数のポートを使用するプログラムです。 (実際には10000〜10020程度使用します。) そのため、スレッドを複数生成し、それぞれのスレッドで処理を行っています。 引用----------------------------------------------------------------------- (から(2)に戻るって、1接続要求を処理したらまたポートを開きなおすってことですか? 保留中の接続要求はすべて失われてしまうと思うのですが。 --------------------------------------------------------------------------- 今のプログラムでは、(から(2)に戻るようになっています。 これが、原因でハンドルが増加していかもしれないので、 早速試してみたいと思います。 又、ハンドル数ですが、(スレッドを1つにして動作させた場合) 初期値では、250個程度です。 パフォーマンスのシステムモニタで値を見た場合、8時間で 600程度になっていました。 1度クライアント接続すると、400程度まで下がり、又、増加します。 | ||||||||
|
投稿日時: 2007-09-16 00:13
10000個もポートも使うのですか? 10000〜10020の20個ですか? 10000だとなにが起きても不思議じゃないですねぇ。
よく読んでませんでした。 たしかに変なプログラムですね。 なにか理由があるのかな。 って、よく見たらHTTPListenerを閉じて無いですね。 ちゃんとCloseしないといくらでもリソース食いますよ。 |
1