C ++ Winsock 2个问题

时间:2010-07-30 16:09:18

标签: c++ api winsock2

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

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

如果我使用了完成端口,那么我可以通过完成端口接收哪些事件? MSDN在文件操作方面有一个列表,但我无法将它们与通过完成端口发送的事件(FD_READ,FD_WRITE,ect ..)联系起来。有没有办法告诉哪个事件正在完成?或者我必须记下这一点并在每次发送或收回某些内容时将其存储在结构中?

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

的帮助

编辑:更好的是,我最好切换到C#来做到这一点吗?它似乎非常受欢迎,更适合这项特定任务。

2 个答案:

答案 0 :(得分:1)

[免责声明:我对套接字编程的经验非常有限。]

  

我计划制作类似的东西   您使用时获得的设置   WSAAsyncSelect(),但使用单独的   线。我可以使用WSAEventSelect()来   将多个套接字链接到一个   事件对象?

这没有意义。事件只需发出一次信号即可。因此,如果您有多个套接字连接到同一个事件,那么当它发出信号时,您永远不会知道哪个套接字标志着该事件!

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

答案 1 :(得分:1)

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

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

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports