我超级郁闷的,别人用TCP经常会粘包,我的TCP不会粘包,反而会断包!!
是这样的,最近在做一个项目,需要用到socket发送文件,我在每次发送的时候定义了发送的包的总个数,包当前ID,最后包的大小,可是在发送的过程中,经常出现了发送失败,结果我对发送缓冲区的数据,和接收缓冲区的数据打印出来,发现,发送方的数据正常,但是接收方却把一个发送包拆成了两次接收,就变成了下面这样
发送方数据:
185,88,141,134,95,212,80,26,167,6,29,34,21,243,100,7,63,250,100,65,194,102,162,63,222,255,224,214,173,222,179,92,121,103,115,169,248,136,164,108,115,224,225,231,224,190,124,70,70,212,143,144,81,132,225,133,146,121,101,218,149,71,202,174,84,
接收方第一个包的数据:
185,88,141,134,95,212,80,26,167,6,29,34,21,243,100,7,63,250,100,65,194,102,162,63,222,255,224,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
接收方第二个包的数据:
173,222,179,92,121,103,115,169,248,136,164,108,115,224,225,231,224,190,124,70,70,212,143,144,81,132,225,133,146,121,101,218,149,71,202,174,84
可是我明明每个接收方的缓冲区都设定了大小,为什么会出现以上这种情况??
谁懂的麻烦告诉我一下

解决方案 »

  1.   


    这是什么逻辑呢?如果你设置buffer为10240个字节,那么就意味着一次receive最多1020个字节,更多的字节需要再执行receive。这丝毫也没有说明它不会是10239、4096或者甚至只有120个字节啊。“拆成了两次接收”,就是分10次又怎么呢?不是都收到了嘛!
      

  2.   

    意味着一次receive最多1020个字节  -->  意味着一次receive最多10240个字节难道你认为生命多大的buffer,那么.net就得填满了?
      

  3.   

    我的buffer设定的是8092,可是为什么第一个buffer都没有填满就跑到第二个buffer里面去了呢
      

  4.   

    ,暂时还没发现声明了较大缓冲区但是.net一次只填一部分的问题,坐等答案。
      

  5.   


    还等什么答案哟
    答案不是很明了了吗?
    TCP是一种流协议
    流嘛
    可以慢慢的流
    也可以流得快点
    也可以分两次流
    也可以三次合成一次流
    看情况看心情
    所以嘛
    TCP有粘包的情况
    但没有断包的情况
    断包,只是没流到而已

    UDP才是以包的形式发
    UDP没有粘包只有丢包
    比如
    你一次发送1024M的数据
    发100次都可能发不出说错了喷我吧
      

  6.   

    哦,又查了一下,不管发送方是怎么发的,接收方的缓存是怎么定义的,TCP每次接收到的数据量都是不固定的,谢谢~