本人做了一个IM软件,在登陆过程中发现在双核的机子下运行client端收不到从服务端发送过来的数据包,事件都没有反应.我用的是TCP传输协议,奇怪的是一开始可以收到数据包,就是发登陆包->服务器验证通过->客户端收到验证通过命令->客户端发取回个人信息命令->服务器返回个人信息->客户端发取所有好友命令->服务器返回所有好友列表->客户端的TClientSocket的接收事件没返应了.....,
调试环境是:服务器在公网,client端在内网,从服务器返回来的数据包控制在不大于1024个字节

解决方案 »

  1.   

    用的什么控件?是不是锁死了?但 TClientSocket 是基于消息的,不存在这个问题是不是你封包组包没有处理好,这个可能性很大
      

  2.   

    我服务器用的是TServerSocket,组包应该没问题吧,奇怪的是客户端在单核机下没有问题,登陆成功;只有在双核机下不行,一开始还有事件反应,后来就没反应了,而且我的socket是在非阻塞模式下工作的
      

  3.   

    如果在双核/多核/多CPU的机器上就出来类似问题,但是在单CPU单核心机器上就没有问题,那可以确定为线程同步死锁。明显的结论是多核的完全并行化导致的(单CPU单核心当中的线程并行并非真正的并行,而是线程之间交互占用CPU时间,从而在时间片上而还是一种串行化的有序的)。
      

  4.   

    登陆是可以了,解决的方法是在客户端的接收事件用sleep(150)停一下,但原因是为什么呢?请大家指点
      

  5.   

    TCP是基于流的协议,所以没有数据包的概念。而是针对你的业务包,进行一个分割标识,可以使用业务/通讯协议头(通常是在一组数据的最前面加入一个四字节来表示数据的长度)当接收到的时候,先取得这四个字节,然后再按这个长度去截取数据进行分析(剩下的部分缓存下来留后面继续处理);另一种是发固长的协议命令,这种方式则需要对短命令进行填充,长命令进行拆分。建议楼主加强对于“流”概念的理解。
      

  6.   

    楼上所说的我明白,我本来也是这样处理,但如果我先读取数据流的长度,比如20 byte ,但其实后面的真实数据部份还没有收到在缓冲区里,收到的只是15 个byte,那用recevebuffer读20时不会出错吗?
      

  7.   

    所以我是先读取缓冲区收到的数据大小buffersize跟数据流的大小(如前4个字节)datasize比较,如果buffersize<datasize则放弃从缓冲区里读取数据
      

  8.   

    如果buffersize <datasize则放弃从缓冲区里读取数据
    ========================
    缓冲区的大小的有限的,而你的报文很有可能比缓冲区大,所以你不可以依赖于系统缓冲区帮你储存数据。自己可以建议一个临时缓冲用来缓存待处理的数据。
      

  9.   

    楼上所说的我明白,我本来也是这样处理,但如果我先读取数据流的长度,比如20 byte ,但其实后面的真实数据部份还没有收到在缓冲区里,收到的只是15 个byte,那用recevebuffer读20时不会出错吗?-------------------
    不會。只會讀到 15 Bytes