【问题标题】:Mixing File Handles and Sockets in Winsock在 Winsock 中混合文件句柄和套接字
【发布时间】:2008-12-28 12:07:11
【问题描述】:

我正在将一些代码从 BSD 套接字移植到 Winsock,但我不确定如何处理下面的情况。

我的原始应用程序在标准输入和网络套接字上运行一个选择:

FD_SET(sock, &fd);
FD_SET(0, &fd);
...
if (select(..., &fd, ... )...)

尝试在 Winsock 中运行它会出现错误 10038 (WSAENOTSOCK),这是有道理的,因为 Linux 中的文件句柄 0 (stdin) 不是 Windows 中的套接字(更准确地说:SOCKET 类型)。

有没有一种简单的方法可以将此测试移植到 Windows 套接字?

【问题讨论】:

    标签: posix winsock sockets


    【解决方案1】:

    我很想得到纠正,但据我所知,Winsock 并没有超出套接字的范围。也就是说,Unix 对 select()、read()、write() 等系统调用的“一切都是文件”理念在 Winsock 中不存在。

    我相信您可以只使用处理套接字和控制台句柄的 Win32 API 来做类似的事情,但它看起来不再像 Winsock(或 BSD)了。

    【讨论】:

    • 我认为你是对的,但我希望不是;这就是我问的原因。问题是我需要扫描两个不同的输入源,并注意第一个有数据的输入源。 Unix 中的 select() 使它变得简单;不过,我不知道如何在 Windows 中执行此操作(而且我不想要 cygwin)。
    • 该死的。接下来我打算推荐cygwin。 :)
    • 我正在移植一个已经用 cygwin 编译的应用程序,但我也想要一个 MinGW 解决方案。在有很多系统的系统上绑定到特定的 cygwin1.dll 从来都不是一件有趣的事情。
    • 实际上,“一切都是文件”确实适用于 Windows。例如,ReadFileWriteFile 在控制台(如 pty)、文件、套接字、管道、com 端口和任意设备驱动程序上都可以正常工作。问题是 Windows 没有为任意文件句柄提供选择函数,尽管我认为完成端口会非常接近。
    • 我也在尝试使用 select() 移植一些代码。您的意思是使用完成端口可以使这更容易,还是通常完成端口 API 提供相同的概念功能。 (我假设你的意思是msdn.microsoft.com/en-us/library/aa365198(v=vs.85).aspx)。我对套接字编程完全陌生,如果这个问题不清楚,请原谅。
    【解决方案2】:

    Winsock 的 select() 仅适用于套接字。更“Windows-y”的替代方法是在两个句柄上使用Asynchronous I/O,然后使用WaitForMultipleObjects

    【讨论】:

    • 感谢马克斯。我今天试试这个。不过,这有点可惜。我希望有一个winsock移植层;看起来这将需要我想象的更多的重写。哦,好吧。
    • 您不能在句柄上使用 Overlapped IO,除非它是以特殊方式创建的。特别是这意味着您将无法在继承的句柄上使用重叠的 IO,例如三个标准流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2011-02-19
    • 2016-04-03
    • 2011-07-28
    • 2021-01-19
    相关资源
    最近更新 更多