2012-04-09 10 views
2

私は頭を傷つけていて、これで何時間も答えを探していました。基本的に私は、他のマシンへのソケットを開いてそこからデータを読み込むことです。このソケットは、ソケットを表すintで渡されるfdopen呼び出しを介してファイルハンドルに "変換"されます。結果のファイルハンドルは、ソケットを介して受信したデータを直接解析するbisonパーサに渡されます。これらはすべてLinux上でうまく動作します。今、私はこのコードをWindowsに移植しようとしましたが、私はうんざりして失敗します。ファイルハンドルとしてのwinsockソケット

 FILE* fileHandle; 
     #if defined WINCE || defined WIN32 
     int fd = _open_osfhandle(socket, _O_RDONLY); 
     if (fileHandle = fdopen(fd, "r")) { 
     #else 
     if (fileHandle = fdopen(socket, "r")) { 
     #endif 
      ... // code to call my parser with fileHandle as argument 

ファイルハンドルが空ストリーム/ファイルを指すようですので、バイソン/フレックスパーサは、Windowsのバージョンに失敗します。コードは次のようになります。誰かが、このようなことを説明している包括的なリソースを指し示すことができますか、代替ソリューションをヒントできますか?

おかげで、最高のよろしく、Windowsので

アンドレ

答えて

6

は、ソケットハンドルは、ファイルハンドルではありません、あなたはCのAPIでそのように扱うことができません。 Linuxでは可能です。しかし、Windowsでは、ソケットハンドルはReadFile/Ex()とWriteFile/Ex()関数に渡すことができます。これらの関数は、名前にもかかわらずファイルだけでなく多数のハンドルタイプをサポートします。

+0

)nSocketFdソケットによるファイルディスクリプタリターン(。いくつかのラッパーを作成したり、避けたいflex/bison生成コードの一部をオーバーライドしない限り、ウィンドウ内の特定の関数を呼び出すことはできません。 –

+0

あなたは運がありません。あなたは何かを書き直す必要があります。 WindowsのソケットハンドルでCファイルI/O関数を使用することはできません。 –

+0

これも私の結論です。この部分を書き直す必要があります。 –

0

あなたは偽物少しする必要がありますが、これは私のために動作します - 私は呼んでコードが基本的に生成されるので、これは直接私を助けていない

FILE* fpSocket = NULL; 

#ifdef WIN32 
    fpSocket = new FILE; 
    fpSocket->_file = nSocketFd; 
    fpSocket->_cnt = 0; 
    fpSocket->_ptr = NULL; 
    fpSocket->_base = NULL; 
    fpSocket->_flag = 0; 
#else 
    // build the file pointer from the file descriptor 
    fpSocket = fdopen (nSocketFd, "rb+"); 
#endif 
関連する問題