我现在有重要问题,关于完成端口,想和大家讨论,描述如下:
  1、客户端连接上来后,发送请求报文,格式为长度信息+业务信息+标志位+数据,想在服务器端(完成端口)处理它,如果第一次投递wsarecv就收够了所有数据,当然万事大吉,现假设未收全,需要再投递wsarecv,那么前面收到的数据如何保存(收全了再处理)(我原来做同步时是多次收的,而且对每个连接都有特定线程专门服务,所以不存在这个问题)。
  2、数据收完了,需要处理,假设处理很费时,那么显然不能让工作线程来干这种粗活,这时需要创建另外的处理线程来处理,我理解是把那个结构和收到的内容传给处理线程,它处理完了,直接投递wsasend返回处理结果,这样做是否又有可能创建很多线程,不这么做的话又应该如何处理
  3、假如客户端上传大文件(分包发送),那服务端应该如何操作,它一次收肯定收不完,肯定多次收,每收到一次似乎都应该有处理线程来保存数据,这样的话,应该如何处理比较有效率
  4、那个transmitfile谁用过,是否一次调用一直到传输完毕才触发完成事件,有没有例子看看,对方怎样接收文件,直接recv就可以?

解决方案 »

  1.   

    你的处理方式都很对啊.  
    长度信息+业务信息+标志位+数据 我觉得不怎么好, 因为如果有其他数据呢? 在收时, 这样就会把你的信息全都搞乱了.
    2. 另外的处理线程来处理 这是自然的, 特别像数据库之类的事,不可能让socket线程来做.
    3. 上传大文件 还是做别的,对于iocp service都一样处理. 因为server不知道recv时的消息是如何啊,所以就收, 收全了,再叫其他线程处理. 
     你的想法已经很高效了.4. transmitfile 用过, 但没有和iocp联合用. transmitfile是系统底层完成的. 而且不知道是传了多多少了. 什么时候传好..
     所以我不太用这东东.
     同时也建议自己来传吧.
      

  2.   

    to  davemin(davemin)
      如果在扩展的重叠结构里把那些信息保存下来呢,这样有没有问题,第一次投递wsarecv时对这些赋默认值,以后再根据实际收到的修改这些值,有没有问题?或者你有什么更合适的定制方法
      

  3.   

    对于这样的问题,俺都是这样做的一个线程监视多个完成端口,多个线程监视多组完成端口
    线程监听socket事件,当任何端口有数据可读的时候,
    读取数据,把端口句柄和数据一起扔给一个全局队列
    继续监听。
    另外再开若干个处理线程
    每个线程从队列中取得数据,完成数据处理
    当然在这个基础上还可以有一些细节要处理,
    考虑到性能,那么监视线程应该在把数据扔给队列的时候,
    同时用事件通知处理线程开始工作,处理线程不用轮询队列,而是等待事件通知在监视线程向队列push数据的时候,还可以提前指定要哪个不忙的处理线程来完成工作
    如果所有线程都忙,还可以再临时增加处理线程,这样可以更加高效在这个基础上简化一下,就可以实现用一个监听线程对应一个处理线程来
    完成连续数据的接收。就是说,监听线程还是把数据push到队列,其对应的处理线程
    把从队列中pop出来的数据组装起来,然后再处理就是了。
      

  4.   

    我打算这样解决一个socket连接中多次发送或接收操作的问题,用一个全局数组或链表来保存socket信息,socket号不可能重的,连上来我就记录下socket信息到这个全局数组或链表中,这样完成端口检测到的变化我总是知道是那个客户端的,根据socket号就能定位到这个客户端的一些特定信息,最后在关闭连接时就把这些东西清除掉。
    另外,我认为可以创建多个完成端口(监视不同的工作),针对每个完成端口起CPU数X2个工作线程,这样效率岂非更高,请各位高手指正。
      

  5.   

    我估计zzyx(菜农)说的你看不懂。
    你还是先看看书。
      

  6.   

    to lostgdi731(O_O):
      哈哈,不错,请多指点
      

  7.   


      可是tangrh(阿唐) 完全看懂了.  1. 针对每个完成端口起CPU数X2个工作线程  
       大多都是这样处理的. 2. 上传大文件 其实是一个很复杂的过程.
       因为可能:
        a. 继线/ 重连
        b. 计算文件大小,重新重断掉的位置开始.
        c. 数据包是否发到目的地的检查?
           如果发一个,检查一个,是不可能的,性能太差了.
           如果使用tcp / ip 也不见得是完全能保证到目的地的.
        d. 如何从收到的包中读取其中的一些数据, 而认为是哪个在传送中的大文件的数据?
      
       所以处理的细节是很多. 而且每一步都要做好. 不然就不行.
      *_*
      

  8.   

    995错误是操作被中断,可能是你前面的操作没有结束之前你又在该io上发出同类的请求造成的。
    至于多于64,可以多起几个线程,然后实现一种算法,使这些套结字均匀分布在不同的线程里面,而没个线程中操作的io不多于64各就可以了
      

  9.   

    to victor_cui(夕阳):
      英雄所见略同啊,我现在暂时让sleep一小段时间,比如200ms,效果就不错了
      至于给它们分组,我正在考虑,想多创建几个完成端口,实行动态分配