2

我需要一个客户端网络线程来响应要传输的新消息以及网络上新数据的接收。我希望避免该线程执行轮询循环,而是仅根据需要进行处理。

场景如下:

客户端应用程序需要通过大部分但不完全同步的协议与服务器通信。通常,客户端向服务器发送消息并阻塞,直到收到响应。

服务器可以异步处理客户端请求,在这种情况下,对客户端的响应不是结果,而是处理已经开始的通知。当服务器完成对客户端请求的处理后,将在未来某个时间点将结果消息发送到客户端。

异步结果通知可以随时到达客户端。这些通知需要在收到时进行处理,即仅当客户端再次发送时才可能处理积压。

客户端网络线程接收和处理来自服务器的通知,并传输来自客户端的传出消息。

为了实现这一点,我需要唤醒一个线程以在接收到网络数据时或在要传输的消息被排入输入队列时执行处理。

线程如何唤醒以执行排队的工作项或来自套接字的数据的处理?

我主要对使用普通的 Win32 API 感兴趣。

非常欢迎提供最小的示例或相关教程!

4

4 回答 4

5

用于套接字的 I/O 完成端口的替代方法是使用WSAEventSelect将事件与套接字关联。然后正如其他人所说,您只需要使用另一个事件(或某种可等待句柄)来发出信号何时将项目添加到您的输入队列,并使用 WaitForMultipleObjects 等待任何一种事件。

于 2009-08-05T22:28:55.287 回答
2

您可以为句柄设置一个 I/O 完成端口,并让您的线程在完成端口上等待:

实际上,您可以让多个线程在端口上等待(每个处理器一个线程通常效果很好)。

于 2009-08-05T18:43:35.117 回答
2

根据 Michael 的建议,我有一些免费代码为 IO Completion Port 样式套接字提供了框架;它还包括一个基于 IOCP 的工作队列。您应该能够从中获取一些东西来解决您的问题

于 2009-08-05T21:30:04.093 回答
0

好吧,如果两个对象都有标准的 Windows 句柄,您可以让您的客户端调用WaitForMultipleObjects来等待它们。

您可能想要研究将网络端口的服务拆分到它自己的线程上。这可能会大大简化事情。但是,如果您最终不得不在新线程和主线程之间同步其他内容,这将无济于事。

于 2009-08-05T19:17:33.673 回答