5

几个小时以来,我一直在摸不着头脑,一直在寻找答案。基本上我所做的是打开一个到其他机器的套接字并从中读取数据。这个套接字通过 fdopen 调用“转换”为文件句柄,传入代表套接字的 int。然后将生成的文件句柄传递给野牛解析器,该解析器直接解析通过套接字接收的数据。所有这些在 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 中,套接字句柄不是文件句柄,您不能在 C API 中这样对待它。在 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 回答