完成端口接受文件数据解决方案

来源:互联网 发布:4k视频剪辑软件 编辑:程序博客网 时间:2024/05/02 12:20

 完成端口: IO CompletionPort 简称IOCP中文名称完成端口,它是一种端口模型,用于管理大批量socket数据的时候非常有效率,所以此端口模型常常用在服务器软件上处理大量的客户端请求.这是微软开发出的一种模型, IIS服务器软件就是用到了这种技术.

 传送数据: 当服务器端用完成端口开发时, 客户端连接服务端后并发送下载数据请求时, 服务端会另起一个线程专门给客户端发送数据, 这时客户端只要接受数据就行. 但是客户端要向服务端发送数据呢? 这就是所谓的"上传", 这个问题过会再讨论.

反向连接: 通常我们所说的连接应该就是正向连接, 客户端连接服务器, 但是"反向连接"是服务器主动连接客户端,其他的一切与正向连接没有什么区别.这种技术在许多..backdoor软件中会用到,因为它可以逃脱杀毒软件的追踪, 或伪装成普通的IE软件为客户端提供服务等.

现在客户端用完成端口实现, 并且利用反向连接方式,管理大批量的的服务端程序. 发送普通的指令没有任何的问题,但是当客户端要接受服务端大量的数据时该怎么办呢. 普通的完成端口管理大量的socket,它当检测到某一socket有数据过来的时候就会单独开一个线程. 接受文件莫非是由多个数据包组成, 难道又多个数据包就要开多少个线程知道把所有的数据接受完为止.直今为止我看有如下几中办法:

 1 单开连接, 当完成端口收到要将要传送数据的消息时, 客户端与服务器端再另外建立一个连接, 不管谁连谁, 之后这个连接只要接受负责传送数据即可,传送完毕断开此连接. 这样似乎有点小题大做了,费资源.

2, 开线程, 当完成端口收到某Socket要传送文件时候开一个线程, 之后每受到该文件的一个数据包时就会通知这个线程继续接受数据, 可以用信号singal来具体实现,这样就会牵扯到共享内存, 互斥等问题,可用临界区变量来解决此问题.在该线程接受数据的同时,客户端与服务器之间的连接该做什么就做什么.看来这种方法行的通

3,暂时独占该连接,,当完成端口收到某Socket要传送文件时把不把再向完成端口投递接受数据请求,这样完成端口就不会再检测到这个socket上的数据,所以客户端的程序会在其他地方管理该socket连接,用完这个socket传送文件后,再往完成端口上投递接受请求,让完成端口再接着管理. 这种方法似乎也可行.

4,这是最没头脑的方法, 每接受一个数据包,开一个线程去接受数据,这种方法行的通,只不过这样会极大的消耗资源,因为每一个数据包不应超过4k~10k字节,传送100M的文件将要开1W个线程.

综上所述,根据各种不同的需求,选择不同的方式,如果可以任意开连接用第一种就不错,但如果不想再开连接,那就用第三种方法就行.不知朋友们还有什么方法呢。

原创粉丝点击