小松です。 In the message of [ruby-list:19872] Re: [mswin32] TCPSocket::new() raises Errno::ENOENT on 1999/12/24 17:49:01 Koji Oda <oda / bsd1.qnes.nec.co.jp> wrote: |fclose した後に closesocket すると例外しませんか? うっ、出てました。すいません。 socket()を呼ぶと、 \Device\Afd\Endpoint \Device\Tcp のハンドルができて、fclose()では\Device\Afd\Endpointの方しかクローズ されず、closesocket()しないと\Device\Tcpのハンドルがどんどんリーク してしまうのです。 [ruby-dev:8066]や[ruby-list:17979]のBeOS用のsocketでやったように、 fclose()ではclose()させないようにして、sock_finalize()でclosesocket() するようにできるといいのですが。 |ハンドルリークのチェックって、どうされているんでしょうか? |よろしかったら教えていただけませんか? |# タスクマネージャでしょうか? タスクマネージャで[表示]→[列の選択]でハンドル数を追加して 変なことが起きていないか確認し、問題があれば、 HandleEx for Windows NT http://www.sysinternals.com/handleex.htm (http://www.sysinternals.com/handleex.zip) で詳細を調べています。 |> これで、一応ハンドルリークはなくなったようなのですが、fclose()を |> 置き換えるよりrubyio.hのstruct OpenFileにソケットかどうかのフラグ |> を立てて、そちらで条件判定する方がいいかも。 | |fclose を置き換えてしまうと、File I/O 全般に影響が出そうな |気がします。 そうなんですよね。 ですので、struct OpenFileを変更する方で週末に作り直そうと思っています。 # しかし、fclose()でCloseHandle()させないような手段があるのか? |以下のパッチで myfdclose 中でfclose(=myfdclose?)を呼んでますが |大丈夫ですか? myfdclose()の前に#undef fcloseがあります。 -- 小松克行 / Katsuyuki Komatsu <komatsu / sarion.co.jp>