【问题标题】:C++ Winsock 2 questionsC++ Winsock 2 题
【发布时间】:2010-07-30 16:09:17
【问题描述】:

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

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

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

感谢任何人都可以在这方面给我的任何*帮助 =D

编辑:更好的是,我最好切换到 C# 来执行此操作吗?它似乎很受欢迎,更适合这项特定任务。

【问题讨论】:

  • 我通常只使用像 select() 这样的 POSIX 函数,而不是花哨的 Winsock 函数。他们似乎工作正常。

标签: c++ api winsock2


【解决方案1】:

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

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

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports.

【讨论】:

  • 当时我还没有完全理解完成端口..但是我已经对这个主题做了相当多的阅读,现在,我当前的配置根本不需要任何事件对象。我不知道 AcceptEx() 会触发完成端口..所以这几乎解决了我的问题。谢谢
【解决方案2】:

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

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

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

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

【讨论】:

  • 这就是我感到困惑的地方。如果你说的是真的,那么如果一个套接字连续获得两个读取事件会发生什么? API 不会在再次发出信号之前等待调用 WSAEnumNetworkEvents() 以重置事件吗?
  • 我不知道。不过,我并不认为 API 会这么聪明。也就是说,是的,我完全希望该事件只设置一次。
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多