socket.Receive(buf, 100000, SocketFlags.None)
这个表示最大能够读取多少,而不是最小读取多少
如果缓冲区中的数据比这个多,就会被截断,而不是等到缓冲区里大于这个数据才开始读你先把基础性的东西搞明白,再谈代码的问题
至于如何切片,网上有许多现成的传文件的代码可以参考

解决方案 »

  1.   

    使用tcp发送和接收无法保证每次都是需要的长度
    需要自己处理“粘包”
    数据解析一般两种做法:
    1.定长发送,server端根据接收长度自动划分数据包
    2.自定义包头,在包头中携带有效数据长度,server端收到数据后,先解包,
    通过包头中携带的数据长度来划分数据
      

  2.   


    以太网 MTU:1500, 发送长度参考这个。
    在局域网由于网络链路状况比较好,可以适当大些,但在公网因为发送失败的
    几率变大了,失败就要重发,所以不是越大越快。
      

  3.   

    1、定长发送是不是这个意思:
          (1)比如客户端一次发送1024字节。
          (2)服务端接收进行判断,如果某个1024字节中,包含了结束字节,那么这个数据包整个就接收完成了。
    服务端要不断接收,直到收齐1024个字节。2、自定义包头是不是这个意思:
           (1)客户端发送的包头中加上发送“字符串”(这里不用字节长度)的长度。
           (2)服务端将接收到的字符串进行拼接,如果接收到的字符串“大于或等于”了报头中的长度,那么就截取指定的长度,进行解析。
    用字节长度比较容易。字符长度也可以,但服务端要先解析出字符,在某些编码下比较困难。
    ‘截取’不是个好的描述词,‘大于’的情况指示了下一组数据的开始,这时可以处理当前数据,剩余数据要保留作为下一组数据的一部份。这里还有个问题:       服务端将接收到的字符串进行拼接,如果接收到的字符串“大于或等于”了报头中的长度                             这里会出现大于吗???TCP是可靠的协议。如果客户端遵循你定的规则,'大于'意味着下一组数据。
      

  4.   

    首先你要明确你所谓的socket是指比较底层的 tcp 通讯方式。其它方式,例如 udp,或者符合 http 通讯协议的 tcp,那么其实就根本没有这么多纠结的讨论了(但是付出的代价是,udp根本不可靠,而http非常慢)。许多人动不动就说什么“socket”,如果连“自己所说的socket是不是专指tcp” 都不能明确,可以认为其大概仅仅是抄别人的。下面只是针对 tcp:1. 不论是“嵌入式”还是pc,你都应该循环接收数据。2. 首先你要自己说明“为什么需要分割?”。这是业务逻辑设计问题。如果你自己说不出为什么需要分割,那么别人也不能绝对化地告诉你“一定比需要分割”。比如说客户端发送3个消息,分别是10000字节、1000000字节、500字节,而服务器端可能分两次接收到,分别是90000字节、20500字节,那么此时接手端是否需要“分割”出不同消息?需要你自己先给出说明。3. 可以使用 List<byte>,而不是 List<string>。也可以使用 MemoryStream 等等数据结构。如果你是定义“分隔符”,那么你要保证消息中不会有重复的分隔符。例如服务器端在初始化时产生一个几十个字节长的、随机产生的字节数组,这可以作为分隔符(数组)。或者假设你传送的内容是 json 格式的,且其中保证不会有两个连续的“换行回车”,那么你就可以用这4个字节(0D 0A 0D 0A)做为分隔符数组。当然由于 tcp 是非常可靠的,你在每一个消息的开头写上“长度”(而不需要结束符)也可以,只不过看起来写上结束符这种方式似乎更容易稳定迅速调试诊断你的通讯程序的bug。4. 弄两种不同的 buffer 大小,这不太实际。所以你可以设置500K 字节缓冲区或者更大一点即可。有人把应用层的缓冲区大小跟底层的什么大小混为一谈,甚至说“如果500K字节数据发送失败了就要重发”,这对于 tcp 应用层编程是根本不存在的事情。把应用层的一个“数据包”拆成几百个网络层“数据包”、走不同的路由、如果发送失败则重发、最终在就收端按照正确顺序供应用层读取,这是人家底层自动化处理的,用不着你纠结人家MTP是所大、是否要重发等等问题。5. 没有那么复杂。你应该先“自己动手”做起来一个4、5行的消息分割程序代码,而不是总是嫌人家告诉你的消息分解机制不好。
      

  5.   

    用不着你纠结人家MTP是所大、是否要重发等等问题  -->   用不着你纠结人家MTU是多大、是否要重发等等问题底层驱动已经做好的东西,你要在“数据流”编程处理的应用层再来纠结一编,这是画蛇添足的。凡是看到纠结底层的,十有八九得到的“说明”都是没用的。真正的参数值,这需要你去测试。基本上应该申请几百K字节缓冲大小,而不是1K字节。另外跟所谓的“空谈socket这个词儿,而不明确说明tcp”相关地问题是,你怎么就知道一定需要分割消息呢?我从你的描述中也完全没有看出来。没有看明白,我绝不会胡乱告诉你“一定要”分割消息还是“一定不需要”分割消息。大部分人刚使用tcp的时候,他写的程序也是肯定根本不需要考虑什么“分隔符”的。因为它是短链接的。而你根本没有提及是长连接还是短连接,可能你还在那个瞎拼凑概念的阶段,还无法再提问之前就说出实际你自己是如何做的。