5

私は頭を悩ませていて、これに対する答えを何時間も探していました。基本的に私がしていることは、他のマシンへのソケットを開き、そこからデータを読み取ることです。このソケットは、ソケットを表す int を渡す fdopen 呼び出しを介してファイル ハンドルに「変換」されます。結果のファイル ハンドルは、ソケット経由で受信したデータを直接解析する bison パーサーに渡されます。これらはすべて Linux で正常に動作します。今、私はこのコードを Windows に移植しようとしましたが、ひどく失敗しました。コードは次のようになります。

        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

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

よろしくお願いします、

アンドレ

4

2 に答える 2

9

Windowsでは、ソケットハンドルはファイルハンドルではないため、CAPIではそのように扱うことはできません。Linuxではできます。ただし、Windowsでは、ソケットハンドルをReadFile/Ex()およびWriteFile / Ex()関数に渡すことができます。これらの関数は、名前に関係なく、ファイルだけでなく、多数のハンドルタイプをサポートします。

于 2012-04-09T18:43:00.353 に答える
0

少し偽造する必要がありますが、これは私にとってはうまくいきます-nSocketFdはsocket()によって返されるファイル記述子です

    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
于 2015-12-07T18:00:40.627 に答える