本帖最后由 VisualEleven 于 2012-09-15 14:34:39 编辑

解决方案 »

  1.   

    不要在一个socket上提交多次的wsarecv或者wsasend
      

  2.   

    数据包本身应该要有一定的格式,比如:包长+包内容
    不管这个包被分到多少分,或者多少个线程同时接收,我们都有办法根据接收包的先后顺序和socket的连接id,将某个socket连接的某个包组成一个完整的包
    比如为每个socket建一个缓冲区,收到该socket的不完整的包都放在这缓冲区里面,在根据包长来判定这个包是否完整
      

  3.   

    同时有多个线程接收同一个socket传来的数据
    这个是你的设计问题,与iocp无关,其它模型也可以做成这样;至于如果判断数据接收完毕,与网络编译无关,更别说iocp了。那是你的业务逻辑。
    你想像成网络编程为如下的样子:
    一头不停的把数据放上传送带,一次可放任意数据;一头不停的从传送带上取出数据,一次同样可取任意数据(根据你的网络好坏,机器好坏等)。
      

  4.   

    1、在一个socket上一次只要投递一个WSARecv,不要投递多个
    2、接收数据需要分包处理,你也可以统一设置为固定长度的数据结构,就省去了分包的复杂,不足这处是会浪费网络带宽
    3、消息包一般应该:标识+长度+消息实体
      

  5.   

    就是说我只要判断当前的socket是哪一个就行了,多个线程会顺序的从完成端口获取数据,我只需要把当前执行的线程中的数据取出来,放到缓存区就行了,对吧??
      

  6.   

    我现在发送的数据中就包含包头+包体两部分,包头中有整个包的数据长度,我就是根据该值判断数据传输是否完成的。
    socket发送,有时不会一次把数据发完,我这里主要是想问的是:每次线程执行的时候,我是不是只用根据socket的值,依次取出相应socket对应的缓存数组,然后把数据依次的保存到该数组后面,这样接到的包中数据的顺序应该就是正确的顺序吧?!我这样测试过,貌似是正确的。
      

  7.   

    无法处理。就像2L所说,不要同时存在多个send或recv。就是说,最多只能同时存在1个未决的send和1个未决的recv
      

  8.   

    看看这个http://www.vckbase.com/index.php/wv/10
      

  9.   

    他的意思应该是在同一个socket上面,最多只能同时存在1个未决的send和1个未决的recv
      

  10.   

    就是说我不能一次循环发送多个WSASend函数
      

  11.   

    不要在同一socket上,同时投递,等get返回再进行其他的send,recv
      

  12.   

    我现在已经处理好分包的问题了
    继续发问:如果即要处理分包问题,又要处理多个客户端socket的链接,这样的情况,应该需要处理多个线程和socket的同步和互斥操作,该如何做呢?
      

  13.   

    自定义协议中指定包头中包含整个数据包的长度字段值。在接收到数据分是,获取包头中这个值,然后对比已经接收到的数据长度,如果等于这个值,表示接完了,否则,继续发送recv接收剩下的数据。