IOCP完成端口与长连接通讯

来源:互联网 发布:鲁班预算软件下载 编辑:程序博客网 时间:2024/04/28 14:23

        最近在写一个通讯代理程序的时候使用了IOCP通讯模型,几年前也使用过IOCP,不过当时的程序是基于短连接的,而这次是长连接的,写这个程序的过程中我觉得主要有以下几点值得注意:

1、整个程序的架构:程序由一个Accept线程,n个工作者线程,1个线程池管理线程,n个业务处理线程构成。Accept线程接收客户端连接并投递WSARecv重叠操作,工作者线程中通过GetQueuedCompletionStatus阻塞收取数据,收取请求数据后将数据放入队列,然后再投递一个WSARecv重叠操作至GetQueuedCompletionStatus阻塞调用,如果是短连接的话,此处就不需要再投递WSARecv重叠操作了,直接调用GetQueuedCompletionStatus收取另一个客户端连接发送过来的数据就可以了。我刚开始也忽略了这一点,导致程序每次只能收取客户端的第一个请求,后面就再也收不到了。

2、可以利用WSARecv和recv结合来完成"包头+数据体"形式的请求包的收取,在我们的程序中,数据体的长度是由包头中的某个参数来指定的,而WSARecv是非阻塞调用的(容易导致包头和数据体被不同的工作者线程收取,重新组装请求很麻烦),在收取这样的请求包时很不方便,于是我先利用WSARecv来收取包头,然后再根据包头中指定的长度调用recv阻塞收取相应长度的数据体,这样虽然性能上带来了一些损失,不过因为组装请求包方面简单很多,耗用的资源更少,总体来看也是值得的。

3、以后再接着补充...

原创粉丝点击