2010-07-30 90 views
2

我已阅读MSDN上Winsock2的文档,但如果有人能帮忙,我仍需要澄清几件事情。C++ Winsock 2个问题

我打算做一些类似于使用WSAAsyncSelect()时得到的设置,但使用单独的线程。我可以使用WSAEventSelect()将多个套接字链接到单个事件对象吗?

如果我使用了一个完成端口,我可以通过完成端口获得哪些事件? MSDN在文件操作方面有一个列表,但我无法通过完成端口发送哪些事件(FD_READ,FD_WRITE,等等)。有没有办法分辨哪个事件正在完成?或者我必须记下这一点,并在每次发送或接收某些内容时将其存储在结构中?

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

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

+0

我通常只使用像select()这样的POSIX函数,而不是花哨的Winsock函数。他们似乎行得通。 – 2010-07-30 18:48:35

回答

1

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

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

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

+0

当时我没有完全理解完成端口..但是我已经完成了相当多的主题阅读,现在,我的当前配置根本不需要任何事件对象。我不知道AcceptEx()会触发完成端口..这几乎解决了我的问题。谢谢 – bitwise 2010-08-05 22:20:32

1

[免责声明:我和socket编程非常有限的经验。]

我计划做类似的 你设置当您使用 WSAAsyncSelect(),但使用一个单独的线程 。我可以使用WSAEventSelect()来将 多个套接字连接到单个的 事件对象吗?

这没有任何意义。一个事件只能发信号一次。所以如果你有多个套接字连接到同一事件,那么当它发出信号时,你永远不会知道哪个套接字发信号通知事件!

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

+0

这是我困惑的地方。如果你所说的是真的,那么如果一个套接字在一行中有两个读事件会发生什么?那么API会不会等待WSAEnumNetworkEvents()被调用来在重新发送信号之前重置事件? – bitwise 2010-07-30 22:00:40

+0

我不知道。我不希望API太聪明了。也就是说,我完全期望这个活动只能设置一次。 – 2010-08-02 15:12:46