2009-08-05 37 views
2

我需要一个客户端网络线程,以便能够对要传输的新消息以及网络上新数据的接收做出响应。我希望避免这个线程执行轮询循环,而只是根据需要进行处理。如何让Win32线程在工作队列和套接字上等待?

的情况如下:

客户端应用程序需要通过一个协议,该协议在很大程度上进行通信的服务器,但不是完全同步的。通常,客户端向服务器发送消息并阻塞,直到收到响应。

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

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

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

为了达到这个目的,我需要做一个线程唤醒来执行处理,无论是在接收到网络数据还是当一个要发送的消息被排入输入队列时。

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

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

一个简单的例子或相关教程将非常欢迎!

回答

5

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

+1

+1;解决问题即使它不能很好地扩展(有时我会得到一个'IOCP是唯一的解决方案'的思路;而且通常实现解决方案要容易得多)。 – 2009-08-11 20:23:21

2

您可以设置为手柄的I/O完成端口,并有完成端口的线程等待:

其实,你可以有多个线程等待的端口(每个处理器一个线程通常工作正常)。

+0

+1 - 迈克尔没有说的是,一旦你的I/O套接字通过I/O完成端口进入,没有什么能阻止你发布你自己的完成值到端口来处理你的工作项目。所以你的线程可以唤醒并处理插座事件或工作项 - 这几乎是你要求的:) – 2009-08-05 21:28:40

0

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

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

2

继续从迈克尔的建议,我有一些免费的代码,提供了IO完成端口样式的插座的东西框架;它也包含一个基于IOCP的工作队列。你应该能够从中获得一些东西来解决你的问题here