winsock socket作为文件句柄

时间:2012-04-09 17:44:07

标签: winsock filehandle

我一直在摸不着头脑,现在正在寻找几个小时的答案。基本上我所做的是打开其他机器的套接字并从中读取数据。通过传入表示套接字的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版本中失败,因为文件句柄似乎指向空流/文件。任何人都可以指出一个全面的资源来解释这个问题或提示替代解决方案吗?

谢谢,最诚挚的问候,

安德烈

2 个答案:

答案 0 :(得分:8)

在Windows中,套接字句柄不是文件句柄,您无法在C API中对其进行处理。在Linux中,你可以。但是,在Windows中,套接字句柄可以传递给ReadFile/Ex()和WriteFile / Ex()函数,它们支持多种句柄类型,而不仅仅是文件,尽管它们的名称。

答案 1 :(得分: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