我需要一个客户端网络线程,以便能够响应要传输的新消息以及在网络上接收新数据。我希望避免这个线程执行轮询循环,而只是根据需要进行处理。
方案如下:
客户端应用程序需要通过主要但非完全同步的协议与服务器进行通信。通常,客户端向服务器发送消息并阻塞,直到收到响应。
服务器可以异步处理客户端请求,在这种情况下是对客户端的响应 不是结果,而是处理已开始的通知。当服务器完成客户端请求的处理时,结果消息将在以后的某个时间点发送到客户端。
异步结果通知可以随时到达客户端。这些通知在收到时需要处理,即只有当客户端再次发送时才能处理积压。
客户端网络线程接收并处理来自服务器的通知,并从客户端传输传出消息。
为了实现这一点,我需要做一个线程唤醒,以便在接收到网络数据时或者当要传输的消息被排入输入队列时执行处理。
线程如何唤醒以执行从插槽中处理排队的工作项或数据?
我主要感兴趣的是使用普通的Win32 API。
非常欢迎最小的示例或相关教程!
答案 0 :(得分:5)
套接字的I / O完成端口的替代方法是使用WSAEventSelect将事件与套接字关联。然后就像其他人所说的那样,你只需要使用另一个事件(或某种可等待的句柄)来表示项目何时被添加到输入队列,并使用WaitForMultipleObjects等待任何一种事件。
答案 1 :(得分:2)
您可以为句柄设置I / O完成端口,让您的线程在完成端口上等待:
实际上,您可以让多个线程在端口上等待(每个处理器一个线程通常运行良好)。
答案 2 :(得分:2)
根据迈克尔的建议,我有一些免费的代码,为IO完成端口样式套接字提供了一个框架;它还包括一个基于IOCP的工作队列。您应该可以从中抓取一些内容来解决here中的问题。
答案 3 :(得分:0)
好吧,如果两个对象都有标准的Windows句柄,您可以让客户呼叫WaitForMultipleObjects等待它们。
您可能希望将网络端口的服务拆分为自己的线程。这可能会大大简化事情。但是,如果您最终必须在新线程和主线程之间同步其他内容,那将无济于事。