我现在有重要问题,关于完成端口,想和大家讨论,描述如下:
1、客户端连接上来后,发送请求报文,格式为长度信息+业务信息+标志位+数据,想在服务器端(完成端口)处理它,如果第一次投递wsarecv就收够了所有数据,当然万事大吉,现假设未收全,需要再投递wsarecv,那么前面收到的数据如何保存(收全了再处理)(我原来做同步时是多次收的,而且对每个连接都有特定线程专门服务,所以不存在这个问题)。
2、数据收完了,需要处理,假设处理很费时,那么显然不能让工作线程来干这种粗活,这时需要创建另外的处理线程来处理,我理解是把那个结构和收到的内容传给处理线程,它处理完了,直接投递wsasend返回处理结果,这样做是否又有可能创建很多线程,不这么做的话又应该如何处理
3、假如客户端上传大文件(分包发送),那服务端应该如何操作,它一次收肯定收不完,肯定多次收,每收到一次似乎都应该有处理线程来保存数据,这样的话,应该如何处理比较有效率
4、那个transmitfile谁用过,是否一次调用一直到传输完毕才触发完成事件,有没有例子看看,对方怎样接收文件,直接recv就可以?
1、客户端连接上来后,发送请求报文,格式为长度信息+业务信息+标志位+数据,想在服务器端(完成端口)处理它,如果第一次投递wsarecv就收够了所有数据,当然万事大吉,现假设未收全,需要再投递wsarecv,那么前面收到的数据如何保存(收全了再处理)(我原来做同步时是多次收的,而且对每个连接都有特定线程专门服务,所以不存在这个问题)。
2、数据收完了,需要处理,假设处理很费时,那么显然不能让工作线程来干这种粗活,这时需要创建另外的处理线程来处理,我理解是把那个结构和收到的内容传给处理线程,它处理完了,直接投递wsasend返回处理结果,这样做是否又有可能创建很多线程,不这么做的话又应该如何处理
3、假如客户端上传大文件(分包发送),那服务端应该如何操作,它一次收肯定收不完,肯定多次收,每收到一次似乎都应该有处理线程来保存数据,这样的话,应该如何处理比较有效率
4、那个transmitfile谁用过,是否一次调用一直到传输完毕才触发完成事件,有没有例子看看,对方怎样接收文件,直接recv就可以?
长度信息+业务信息+标志位+数据 我觉得不怎么好, 因为如果有其他数据呢? 在收时, 这样就会把你的信息全都搞乱了.
2. 另外的处理线程来处理 这是自然的, 特别像数据库之类的事,不可能让socket线程来做.
3. 上传大文件 还是做别的,对于iocp service都一样处理. 因为server不知道recv时的消息是如何啊,所以就收, 收全了,再叫其他线程处理.
你的想法已经很高效了.4. transmitfile 用过, 但没有和iocp联合用. transmitfile是系统底层完成的. 而且不知道是传了多多少了. 什么时候传好..
所以我不太用这东东.
同时也建议自己来传吧.
如果在扩展的重叠结构里把那些信息保存下来呢,这样有没有问题,第一次投递wsarecv时对这些赋默认值,以后再根据实际收到的修改这些值,有没有问题?或者你有什么更合适的定制方法
线程监听socket事件,当任何端口有数据可读的时候,
读取数据,把端口句柄和数据一起扔给一个全局队列
继续监听。
另外再开若干个处理线程
每个线程从队列中取得数据,完成数据处理
当然在这个基础上还可以有一些细节要处理,
考虑到性能,那么监视线程应该在把数据扔给队列的时候,
同时用事件通知处理线程开始工作,处理线程不用轮询队列,而是等待事件通知在监视线程向队列push数据的时候,还可以提前指定要哪个不忙的处理线程来完成工作
如果所有线程都忙,还可以再临时增加处理线程,这样可以更加高效在这个基础上简化一下,就可以实现用一个监听线程对应一个处理线程来
完成连续数据的接收。就是说,监听线程还是把数据push到队列,其对应的处理线程
把从队列中pop出来的数据组装起来,然后再处理就是了。
另外,我认为可以创建多个完成端口(监视不同的工作),针对每个完成端口起CPU数X2个工作线程,这样效率岂非更高,请各位高手指正。
你还是先看看书。
哈哈,不错,请多指点
可是tangrh(阿唐) 完全看懂了. 1. 针对每个完成端口起CPU数X2个工作线程
大多都是这样处理的. 2. 上传大文件 其实是一个很复杂的过程.
因为可能:
a. 继线/ 重连
b. 计算文件大小,重新重断掉的位置开始.
c. 数据包是否发到目的地的检查?
如果发一个,检查一个,是不可能的,性能太差了.
如果使用tcp / ip 也不见得是完全能保证到目的地的.
d. 如何从收到的包中读取其中的一些数据, 而认为是哪个在传送中的大文件的数据?
所以处理的细节是很多. 而且每一步都要做好. 不然就不行.
*_*
至于多于64,可以多起几个线程,然后实现一种算法,使这些套结字均匀分布在不同的线程里面,而没个线程中操作的io不多于64各就可以了
英雄所见略同啊,我现在暂时让sleep一小段时间,比如200ms,效果就不错了
至于给它们分组,我正在考虑,想多创建几个完成端口,实行动态分配