用IOCP编写服务端和客户端,服务端主动给写客户端下发数据没问题(局域网中每秒7000~9000包没什么问题),但是如果工客户端给服务端发送数据太快(局域网中300包以上服务端就会出现缓冲区数据粘连),服务端和客户端用的类是同一个,比较郁闷!请高人给点提示,谢谢!

解决方案 »

  1.   

    你的协议设计有问题为了避免粘包, 你应该将协议设计成 “ 固定长度包头 + 变长包体”那么, 你在投递WSARecv的时候,  首先接受头, 再根据头 投递包体。 这样,可以从根本上解决粘包的问题。
      

  2.   

    虽然TCP也可以通过程序控制关闭Nagel算法,  那样也可以避免粘包。但那样会导致TCP传输性能下降。 所以在协议层上做文章比较好。
      

  3.   

    楼上的说法是正确的,Nagel算法将几个较短的包构造成一个较大的包进行传递
    通常的做法中是在协议中定义数据长度来进行控制
      

  4.   

    多谢大家!特别是"wangjia184",找到问题所在了,我启动了2个IO工作线程导致了线程收到了一个不完整的包,如何解决这个问题呢?
      

  5.   

    现在的想法是收到通知的线程去查看是否有线程对这个连接收数据的操作,如果有就不用调用WSARev接收数据,如果没就调用WSARev来接收数据,不知道这样的方法是否可行!
      

  6.   

    to "wangjia184"  
    对你说得不是太明白, 你的接收线程是指调用GetQueuedCompletionStatus()函数来查询完成端口上的消息还是从连接上读取数据? 发送线程呢? 线程池中的线程是进行业务处理吗? 
      

  7.   

    谢谢,明白你的意思了,我现在的问题就是因为我开了两个接收线程造成的,看了许多关于IO开发的文章说工作线程数目等于cpu个数,所以就开了两个IO工作线程,按你的说法就是只能能有一个工作线程接收数据,我在接收的线程中已经对不完整处理了,我的Buff是单独的一个类,收到数据后检查是否完整包和移动数据处理