【问题标题】:winsock socket as file handlewinsock 套接字作为文件句柄
【发布时间】:2012-04-09 17:44:06
【问题描述】:

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

感谢和最好的问候,

安德烈

【问题讨论】:

    标签: winsock filehandle


    【解决方案1】:

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

    【讨论】:

    • 这对我没有直接帮助,因为我调用的代码基本上是生成的。除非我创建一些包装器或覆盖一些我想避免的 flex/bison 生成的代码,否则我不能在其中调用 windows 特定的函数。
    • 那你倒霉了。你需要重写一些东西。您不能在 Windows 中的套接字句柄上使用 C 文件 I/O 函数。
    • 是的,这也是我的结论。部分内容需要重写。
    【解决方案2】:

    你需要伪装一点,但这个对我有用 - 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2021-01-19
      • 1970-01-01
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多