6

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

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

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

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

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

4

2 回答 2

2

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

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

于 2008-12-28T15:08:53.820 回答
1

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

于 2008-12-29T02:20:59.967 回答