我想知道 使用socket 通信必须制定 缓冲区的大写么 如果不制定 会出现粘包等错误?
有其他解决方案没有?

解决方案 »

  1.   

    哦 知道了 你的意识的  
    我的想法是 使用socket 的 Receive 方法时 必须要制定 起参数的大写么?
      

  2.   

    你的缓冲区byte[]是必然有大小的。
    你的receive函数就是把数据放到缓冲区里,这个函数是有返回值的,代表实际接收的长度。这个长度必然小于等于缓冲区的长度。
    不一定每次receive接收都把缓冲区写满。
      

  3.   

    从几k到几百k都很常见,选择的标准基于测试,你觉得哪一个参数的性能最高就可以采用哪一个。当然测试时要考虑到网络情况。有时候比如说你设置为10k时逻辑测试已经没有任何问题,然后测试时你会发现其实只要将这个值调整80k就可以让程序速度提高2~3倍。然而其它时候,换一种网络环境(比如说你的办公室局域网里有人搞什么ARP劫持、什么bt终结者之类的破软件),即使你设置为128k,那么你每一次Receive也不过几k,完全是断断续续地接收到内容,所以貌似申请较大的缓冲区是没有必要的。
      

  4.   

    使用.net包装的socket,接收数据动作是一个字节流的操作,严格来说跟底层tcp所说的粘包是两回事。不论申请多大的buffer,你都是要连续执行 Receive,直到你得到了消息结束标志。(举个例子假设)比如说msn的消息就是以文本行结束为消息结束标记。此时不论你申请多大的buffer,你都要连续记录收到的各个buffer中的有用字节,直到程序看到一个buffer的最后恰好是行结束标志,这时候要把所有已经收到过的字节拿出来,因为这里边有可能只有只有一条命令也有可能有多条命令,所以需要将收到的所有字节按照一行一行的方式解析出来成为逐条命令,然后逐条处理。