2016-11-28 8 views
0

私はstdin、stdout、stderrをソケット経由でリダイレクトしたいと思っています。dup2と同等のC言語のWindowsソケット

このコードはLinux上で動作します:

dup2(socket, 0); 
dup2(socket, 1); 
dup2(socket, 2); 

ではなく、Windows上のソケットはディスクリプタではありませんので。

Windowsでこれを行うにはどうすればよいですか?

+1

「うまくいきません」とは、問題の説明ではありません。 [ask]を読んで、助言に従って[mcve]を提供してください。 – Olaf

+0

@Olaf動作しなければならない理由がないので動作しません。私は、「Windows上で同等の機能は何ですか?」という意味ではなく、「これを試して問題を発見した」ということです。 – immibis

+0

@immibis:必要な情報がなければ、どうすればわかりますか?私は、誰かが何を考えているかを知るために透き通っているわけではありません。 – Olaf

答えて

0

Windowsでは、ソケットAPIの戻り値はSOCKETです。これはファイル記述子ではありません(または、必ずしも小さな負の整数ではありません)。ただし、いくつかの方法でファイルハンドルとして使用することができます。according to MSDN特に、ReadFile()WriteFile()で使用できます。

MSライブラリ関数_open_osfhandle()を使用して、OSレベルのファイルハンドルをCスタイルのファイル記述子に変換できます。これは通常のファイルで動作しますが、SOCKETで動作する場合と動作しない場合があります。そのファイル記述子を取得したら、それを_dup2()に渡し、_fileno(stderr)を第2引数として渡すことができます。このディスクリプタは必ず_close()で終了し、元のハンドルも閉じます。

+0

ありがとうございますが、私はこのhttp://pastebin.com/utXNQnymを試してみました。彼はうまくいきません。 – Switch

+0

ソケットハンドルではなく、 '_dup2()'と 'close()'に記述子( 'sck')靴下)。また、2つの変数を互いに同義語にしないでください。エラーコードを確認してください。それでも動作しない可能性があります。 – Davislor

+0

ああ、私はそれを修正しました。エラーコードはありませんが、メッセージは送信されません。コンソールやソケットに表示されませんでした(wiresharkで見ました) – Switch

関連する問題