2

我已经阅读了 MSDN 上 Winsock2 的文档,但如果有人可以提供帮助,我仍然需要澄清一些事情。

我计划进行类似使用 WSAAsyncSelect() 时获得的设置,但使用单独的线程。我可以使用 WSAEventSelect() 将多个套接字链接到单个事件对象吗?

如果我改用完成端口,我会通过完成端口获得哪些事件?MSDN 有一个关于文件操作的列表,但我无法将它们与哪些事件(FD_READ、FD_WRITE 等)相关联,这些事件将通过完成端口发送。有没有办法知道哪个事件正在完成?还是我每次发送或接收某些东西时都必须注意这一点并将其存储在一个结构中?

感谢任何*帮助任何人都可以给我这个=D

编辑:更好的是,我最好切换到 C# 来执行此操作吗?它似乎非常流行并且更适合这项特定任务。

4

2 回答 2

1

[免责声明:我在套接字编程方面的经验极为有限。]

我计划进行类似使用 WSAAsyncSelect() 时获得的设置,但使用单独的线程。我可以使用 WSAEventSelect() 将多个套接字链接到单个事件对象吗?

那是没有意义的。一个事件只能发出一次信号。因此,如果您有多个套接字连接到同一个事件,那么当它收到信号时,您永远不会知道哪个套接字发出了该事件的信号!

您可以做的是为每个套接字创建一个事件(每个套接字可能有多个事件:对于您感兴趣的每个 FD_* 事件)并使用 WSAWaitForMultipleEvents (http://msdn.microsoft.com/en-us/library/ms742219 %28v=VS.85%29.aspx )

于 2010-07-30T18:50:43.857 回答
1

不,您不能将多个套接字链接到单个 WSAEVENT。您必须为要接收通知的每个单独的套接字调用 WSACreateEvent() 和 WSAEventSelect()。不过,您可以使用 WSAWaitForMultipleEvents() 让单个线程等待来自多个套接字的事件。

至于使用完成端口,我建议你阅读MSDN关于此事的文章,例如:

Windows Sockets 2.0:使用完成端口编写可扩展的 Winsock 应用程序

于 2010-08-02T21:31:20.607 回答