急!怎么用完成端口创建长连接socket?
请回答问题时考虑以下前提
[对完成端口不熟悉,对多线程维持socket的长连接不熟悉]
我在网上查看了很多完成端口文章,包括一些codeproject上的英文文章,但是对完成端口如何维持一个socket的长连接状态仍然不是很明白
在吸收这么多文章后,我的理解是以下这样(如有错误,请大虾们纠正)
1、建立监听线程,所要建立的长连接socket在监听线程里创建,并和一个完成端口关联,只要这个线程不结束,那么这个长连接socket就可以长期保持在程序中(或者说进程中)
// 上面是我对如何在线程中维持socket长连接的理解
// 下面是我对完成端口的工作过程的理解
2、一个队列状态查询线程用函数GetQueuedCompletionStatus()不断的查询消息队列(还是说这个函数是阻塞的,然后通过等待消息来把函数参数中对应的函数送进线程池的其中一个线程中去执行?)
3、线程池中的等待线程在获得系统资源后进入运行态,线程执行所装载的函数(函数执行的结果返回到哪里?)
// 问题:是不是以前WSAsend这样的动作到了完成端口就变成了投递(Post)进线程让线程自己等待资源去运行的动作?但是WSAsend或者WSARecv这样的函数返回的是收发的结果,不是业务处理的结果,那业务处理是要放在线程池里的线程里做还是放在其他线程里做
4、是不是有一个线程函数专门负责投递(Post)消息(或者说工作函数)的?
5、我对结构(Struct)不是很熟悉,是不是完成端口的线程池一定要定义一个线程池结构?
最后说明一下我的程序的业务要求
程序是服务端
后台程序 ----- (前置)服务端 ----- 客户端
1、客户端登陆服务端
2、服务端应答登陆
3、客户端发心跳维持连接
4、服务端回心跳应答
--------------------------上面就是服务端/客户端在无业务数据时所要做的事情
--------------------------当有业务数据请求时
5、后台程序发送数据提取请求,要求客户端返回后台程序所需要的数据
6、服务端接受到后台程序请求,将请求转换成C/S之间的协议
(下面就是关键步骤)
7、服务端(SEND)发送协议到客户端并等待(RECV)接收客户端返回的相应数据
8、接收完数据后就回到等待心跳的状态,继续应答心跳
我要实现上面的功能,我要怎么做?有没有简单一点,多点注释的IOCP例程?(英文也好,不过最好1、2行就有一点注释的)
现在网上找到的多数是在函数头有介绍这个函数是干什么的,但是具体内部怎么实现却看得一头雾水,没有体谅到菜鸟的阅读能力,难道说菜鸟就用不上IOCP吗?
希望各位大虾们多抬贵手,谢谢了!!!