Winsock Programmer's FAQ |
プロセス間でのソケットの受け渡しWarren Young、Frank Schmied 著 ソケットをあるプロセスから他のプロセスに受け渡したいと思った
とき、その「正式に認可されている」方法は Winsock 2 の新しい関数
Winsock 2 では、 他に Win32 API の面白い機能として、新規プロセスを生成する
ときに、それに異なる「標準ハンドル」(標準入力、標準出力、標
準エラー)を与えることができる、というものがあります。MSKB の
記事 Q190351
がこの方法について記述しています。この機能は子プロセスに対し
てしか使えない、ということに注意してください。つまり自分自身
の標準入出力ハンドルをソケットにリダイレクトすることはできま
せん。またこの方法を行うと、プロセスによっては振舞いがおかし
くなるものもある、という注意点もあります。この機能は Unix の
世界の もともとの FAQ では次に 、この方法は Winsock 1.1 ではできない、 と述べていました。しかし結局は、Frank Schmied 氏によって、多少ト リッキーな方法ではありますが、Win32 上の Microsoft Winsock 1.1 においてこれを行う方法が示されました。Frank 氏は以下のように述べ ています。 Winsock 1.1 では、Win32 の OpenProcess(PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId()); ハンドルの複製は以下のようになります。 SOCKET ConvertProcessSocket(SOCKET oldsocket, DWORD source_pid) { HANDLE source_handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, source_pid); HANDLE newhandle; DuplicateHandle(source_handle, (HANDLE)oldsocket, GetCurrentProcess(), &newhandle, 0, FALSE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS); CloseHandle(source_handle); return (SOCKET)newhandle; } この方法は、私のマルチプロセスWebサーバではちゃんと動いて
います。上記の関数は、新しいプロセスにおいてソケットを複製し、
古いプロセスにおいてハンドルを閉じます。このハンドルは、古い
ハンドルと同じアクセス属性を持ちますが、子プロセスには引き継
がれません。この振舞いを変更するには、
私の理解ではこれは、元プロセスがローカル SOCKET ハンドルを
警告: Frank 氏のテクニックは、おそらく Microsoft の実 装でしか動作しません。Win16 では動作しませんし、WinCE でも動作し ないかもしれません。Layered Service Providers が存在していると動 くかもしれないし動かないかもしれません。例外は Windows NT 4.0 SP 4 以降で、これにはインストール可能ファイルシステム(IFS)層にパッ チが当たっていてこの種のものが動くようになっています。またこのテ クニックは、第2火曜日で上弦の月の日は、プログラムの実行前に "oompa hoozah" の呪文をゆっくり四回唱えないと、動作しないかもし れません。簡単に言うと、このテクニックは詐欺なのです。私はちゃん と警告しましたからね。:) Copyright © 2000 by Warren Young and Frank Schmied. All rights reserved. |
<< CSocket はなぜ有害か? | ファイヤウォールとの付き合い方 >> |
Last modified: $Id: passing-sockets.html,v 1.6 2002/11/09 20:40:33 ksk Exp $ | Go to the original FAQ page |
< Go to the main FAQ page | << Go to the Home Page |