- PR -

通信プログラムのハンドルリークについて

1
投稿者投稿内容
ぶー
会議室デビュー日: 2007/09/15
投稿数: 19
投稿日時: 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)の状態でクライアント側から接続せず、放置した場合、タスクマネージャにてハンドル数が
徐々に増えていってしまいます。
ある程度増加した後に、クライアントより接続した場合、一旦ハンドル数は減少するのですが
元の値よりも幾分多きい値となっています。
何が原因であるか、分かる方いらっしゃいましたらご教授の程宜しくお願いします。

れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-15 18:54
引用:

ぶーさんの書き込み (2007-09-15 18:13) より:
(4)の状態でクライアント側から接続せず、放置した場合、タスクマネージャにてハンドル数が
徐々に増えていってしまいます。
ある程度増加した後に、クライアントより接続した場合、一旦ハンドル数は減少するのですが
元の値よりも幾分多きい値となっています。
何が原因であるか、分かる方いらっしゃいましたらご教授の程宜しくお願いします。



個数はどのくらいですか?
また、元の値より多くなってる期間はどのくらいまで確認しましたか?

WinAPIを直接たたいていても、
内部のキャッシュなどでハンドル数は減らない場合もあります。

まして.Netですから、ある程度仕方ないです。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-09-15 19:05
こんにちは。

直接の回答ではないです。

なんだか私には違和感のあるプログラムですね。

引用:

ぶーさんの書き込み (2007-09-15 18:13) より:
(1)スレッドを作成し、各ポート毎に処理をする。


1つのサービスで複数ポートを使用するということですか?
「接続要求毎にスレッドを作成して処理する」の間違いではないんですよね?

引用:

(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
(8)listener.stop->(2)へ


(8)から(2)に戻るって、1接続要求を処理したらまたポートを開きなおすってことですか?
保留中の接続要求はすべて失われてしまうと思うのですが。
(4)〜(7)のループではないのですか?

ぶー
会議室デビュー日: 2007/09/15
投稿数: 19
投稿日時: 2007-09-15 19:24
お返事頂きありがとうございます。

アプリケーションの処理内容についてですが、
1つのサービスで複数のポートを使用するプログラムです。
(実際には10000〜10020程度使用します。)
そのため、スレッドを複数生成し、それぞれのスレッドで処理を行っています。

引用-----------------------------------------------------------------------
(から(2)に戻るって、1接続要求を処理したらまたポートを開きなおすってことですか?
保留中の接続要求はすべて失われてしまうと思うのですが。
---------------------------------------------------------------------------
今のプログラムでは、(から(2)に戻るようになっています。
これが、原因でハンドルが増加していかもしれないので、
早速試してみたいと思います。

又、ハンドル数ですが、(スレッドを1つにして動作させた場合)
初期値では、250個程度です。
パフォーマンスのシステムモニタで値を見た場合、8時間で
600程度になっていました。
1度クライアント接続すると、400程度まで下がり、又、増加します。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-09-16 00:13
引用:

ぶーさんの書き込み (2007-09-15 19:24) より:
アプリケーションの処理内容についてですが、
1つのサービスで複数のポートを使用するプログラムです。
(実際には10000〜10020程度使用します。)
そのため、スレッドを複数生成し、それぞれのスレッドで処理を行っています。



10000個もポートも使うのですか?
10000〜10020の20個ですか?

10000だとなにが起きても不思議じゃないですねぇ。

引用:

引用-----------------------------------------------------------------------
(から(2)に戻るって、1接続要求を処理したらまたポートを開きなおすってことですか?
保留中の接続要求はすべて失われてしまうと思うのですが。
---------------------------------------------------------------------------
今のプログラムでは、(から(2)に戻るようになっています。
これが、原因でハンドルが増加していかもしれないので、
早速試してみたいと思います。



よく読んでませんでした。
たしかに変なプログラムですね。
なにか理由があるのかな。

って、よく見たらHTTPListenerを閉じて無いですね。
ちゃんとCloseしないといくらでもリソース食いますよ。
1

スキルアップ/キャリアアップ(JOB@IT)