急!怎么用完成端口创建长连接socket?

zxczxczxc 2006-10-16 04:12:16
请回答问题时考虑以下前提

[对完成端口不熟悉,对多线程维持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吗?

希望各位大虾们多抬贵手,谢谢了!!!
...全文
309 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxczxczxc 2006-10-16
  • 打赏
  • 举报
回复
正在找DentistryDoctor所提到的书,不过不知道这本书要耗我多少时间去看(如果是英文的话更长),我这边的项目下星期就要检查了,这部分结构还没有头绪到底要怎么改,麻烦大虾们尽量抬抬贵手帮帮小弟吧.........
zxczxczxc 2006-10-16
  • 打赏
  • 举报
回复
DentistryDoctor可以解释一下吗?

或许先告诉我多个长连接SOCKET如何在一个工作线程内维持(是用一个线程来维护这些已产生的SOCKET吗?还是用多个线程?关于这一点一般的IOCP是怎么做的?)
zxczxczxc 2006-10-16
  • 打赏
  • 举报
回复
补充一下,收发包是一次收发的,包头包体都在同一包内
aa3000 2006-10-16
  • 打赏
  • 举报
回复
进来接分。
DentistryDoctor 2006-10-16
  • 打赏
  • 举报
回复
看来楼主没明白IO模型与长连接的关系.

建议阅读《Windows网络编程》,如果找不到,可以找其第二版的电子版(chm?),好像是e文的。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧