小松です。

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>