socket.Receive(buf, 100000, SocketFlags.None)
这个表示最大能够读取多少,而不是最小读取多少
如果缓冲区中的数据比这个多,就会被截断,而不是等到缓冲区里大于这个数据才开始读你先把基础性的东西搞明白,再谈代码的问题
至于如何切片,网上有许多现成的传文件的代码可以参考
这个表示最大能够读取多少,而不是最小读取多少
如果缓冲区中的数据比这个多,就会被截断,而不是等到缓冲区里大于这个数据才开始读你先把基础性的东西搞明白,再谈代码的问题
至于如何切片,网上有许多现成的传文件的代码可以参考
需要自己处理“粘包”
数据解析一般两种做法:
1.定长发送,server端根据接收长度自动划分数据包
2.自定义包头,在包头中携带有效数据长度,server端收到数据后,先解包,
通过包头中携带的数据长度来划分数据
以太网 MTU:1500, 发送长度参考这个。
在局域网由于网络链路状况比较好,可以适当大些,但在公网因为发送失败的
几率变大了,失败就要重发,所以不是越大越快。
(1)比如客户端一次发送1024字节。
(2)服务端接收进行判断,如果某个1024字节中,包含了结束字节,那么这个数据包整个就接收完成了。服务端要不断接收,直到收齐1024个字节。2、自定义包头是不是这个意思:
(1)客户端发送的包头中加上发送“字符串”(这里不用字节长度)的长度。
(2)服务端将接收到的字符串进行拼接,如果接收到的字符串“大于或等于”了报头中的长度,那么就截取指定的长度,进行解析。用字节长度比较容易。字符长度也可以,但服务端要先解析出字符,在某些编码下比较困难。
‘截取’不是个好的描述词,‘大于’的情况指示了下一组数据的开始,这时可以处理当前数据,剩余数据要保留作为下一组数据的一部份。这里还有个问题: 服务端将接收到的字符串进行拼接,如果接收到的字符串“大于或等于”了报头中的长度 这里会出现大于吗???TCP是可靠的协议。如果客户端遵循你定的规则,'大于'意味着下一组数据。