2011-01-24 14 views
3

小さなテストプログラム(Linuxのmingwでコンパイル)では、Winsock2のsocket呼び出しの実装を使用して取得したソケットfdでreadwriteコールを使用できないことに気付きました。書き込み呼び出しは<を返し、errno = EBADFを設定します。winsockは読み取り/書き込みをサポートしていません

xinetdからプログラムを実行して、それらのstdin/stdoutが常にソケットであるという前提を除いて考える。 (一部のプログラムはgetpeernameを呼び出しますが、ソケットでなければ失敗し、その後は途中で終了することがあります)。

したがって、stdinから読み書きする{ファイル記述子型}/stdoutは、fdについての仮定をしない限り、win32環境で合理的に動作するはずですか?

より簡単に言えば、win32(well、mingw)writeの実装でWinsock2ソケットfdsを配線するために実行されるいくつかのマジック関数呼び出しがありますか?

答えて

5

Windowsで正常動作をしたい場合は、mingwを忘れてください。これはMSVC++標準ライブラリを使用しています。これは、の標準C標準に準拠することはできません。悲しいことにcygwinはちょっと肥大ですが、私はちょうどWindowsのプログラミングの価格として膨らみを受け入れ、cygwinと一緒に行くでしょう。または、あなたが書いたすべてのプログラムの2つの異なるバージョンを書くことができます。#ifdefのMSVCとPOSIXの両方をサポートします。

+0

ああ、cygwin、良い呼び出し、その存在を私に思い出させるために感謝します。私はcygwin gccを単に実行するためにワインを使わなくても、クロスコンパイルが可能かどうか疑問です。 – user562374

+0

間違いなく可能です。ちょうど "cygwin linuxのクロスコンパイラ"のようなものをgoogleし、何が表示されるかを参照してください。 –

0

Windowsのソケットハンドルはファイルハンドルではありません。 Winsock関数を使用して、状態の読み取り/書き込み/変更を行う必要があります。

selectまたはそのilkをWindowsの他の種類のハンドルと一貫して使用することはできません。

5

read()およびwrite()は、POSIX I/Oシステムコールであり、ソケットAPIコールではありません。

MinGWは、ネイティブWindowsプラットフォームにコンパイルするためのものです。 POSIX環境を提供しません。

  1. は、ソケットAPIはsend()recv()呼び出しを使用してください:

    のWinsockでのMinGWを使用して

    は、次の2つのオプションがあります。
  2. Windows I/OシステムコールWriteFile()ReadFile()を使用してください。
関連する問題