Winsock套接字作为文件句柄

5
我已经苦思冥想并花了几个小时寻找答案。基本上,我打开一个套接字连接到另一台机器并从中读取数据。然后通过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 版本中失败,因为文件句柄似乎指向一个空的流/文件。有人可以指出一个全面的资源来解释这个问题,或者提示一个替代方案吗?
谢谢并致以最好的问候,
安德烈
2个回答

9
在Windows中,套接字句柄不是文件句柄,因此您不能在C API中将其视为文件。而在Linux中,您可以这样做。但是,在Windows中,套接字句柄可以传递给ReadFile/Ex()和WriteFile/Ex()函数,它们支持众多的句柄类型,而不仅仅是文件,尽管它们的名称是这样的。

这对我没有直接帮助,因为我调用的代码基本上是生成的。除非我创建一些包装器或覆盖一些 flex/bison 生成的代码,否则我无法在其中调用 Windows 特定功能,但我想避免这样做。 - André
1
那么你就没那么幸运了。你需要重新编写一些东西。在Windows中,你不能在套接字句柄上使用C文件I/O函数。 - Remy Lebeau
是的,这也是我的结论。其中的部分需要重新编写。 - André

-1
你需要有点虚假,但这个对我有效 - 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

在Windows SDK的后续版本中,FILE结构是不透明的。 - legalize

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接