我用vb实现的一套系统,用的winsock数组实现多用户。问题是服务器发出的信息客户端偶尔会出现收不到的情况,此时网络是通的,客户端连接没有失败,服务器也能被其他客户端连接上。我搜索了一些资料说是tcp协议不会丢包的只可能出现粘包,但我看了日志信息,确实是有服务器发出的信息客户端没有收到,粘包问题倒是没出现。不知道有没有哪位高手遇到过这个问题,请赐教

解决方案 »

  1.   

    你自己维护缓冲区没?如果vb程序做了连续的2个发送,包A,包B,给winsock
    winsock是不是可以把AB混合,比如A+B的一部分,做成了一个包,在下一层发送了,
    这样接收端处理了A数据,但是余下的半截B包给扔了...在接收端看起来是丢包了.如果接收端只从接收缓冲区里面删除A包,留下那半截B包,应该不会这样丢包了吧
      

  2.   

    其实 粘包会有的 在消息头尾 加上 自定义标志  发送后要 doevents 
      

  3.   

    忘记说了 粘包的解决是 消息头尾 加标志 收到消息 进行人为拆分  注意 发送后 要执行 doevents可以减少粘包 但是不会有
      

  4.   

    影子啊!好久不见,嘿嘿.话说,TCP协议本身当然不会丢包,但是包不是丢在网络传输层的哦.我的推测是,封包收到后,会有一个从内核到用户层的过程,而用户层有个缓冲区,数据在未被处理前是放在缓冲区里的.如果处理数据的过程耗时太长,导致缓冲区满了,那新的数据进来会不会就把最旧的数据"顶"出去了呢?又或者直接不接收新的数据?以前帮别人改过一个网络聊天软件就是这样,客户端数量增加到一定程度时,就开始丢包,但协议也是TCP.看代码后才知道,他把所有处理过程是写在DataArrival事件里的,而且服务器端要判断很多的东西,还要查询数据库,这就导致数据多了时DataArrival事件执行时间过长不返回,经测试最长居然要0.5秒左右.后来经过优化,一收到数据后先不处理,而是加入到一个数据队列里,然后DataArrival事件里马上执行完毕,而数据处理是由一个定时器来扫描队列的方式完成的,由于定时器事件得到执行时一定是系统比较闲的时候,所以可靠性就保证了,这个问题便解决了.你可以参考一下.