Ⅰ Socket接收数据怎么清空缓存区
通过Socket发送接收消息遇到个问题 C# code Socket newSocket = socket.Accept(); newSocket.Receive(messages); 获取消息没问题 但是总有缓存区无法清空的问题 比如说我先发一句:"我是中国人" 服务端能正确接收到这句消息:"我是中国人" 这边再发送一个字:"你" 理想状态下服务端应该显示一个字:"你" 但是实际上由于缓存区尚未清空的缘故变成了:"你是中国人" 只有当消息长度大于缓存区消息时旧消息才能被完全覆盖:"我不是中国人" 服务端这时能正确的显示:"我不是中国人" ========================================================= 发送消息这边我测试了下 发送出去的消息本身没有问题 C# code socket.Send(byteMessage); socket.Shutdown(SocketShutdown.Both); socket.Close(); 但是到了接收方收到消息就出问题了。我想应该是缓冲区问题 望各位大大解惑------解决方案-------------------------------------------------------- 这是你数组的问题 跟Socket缓冲没关系
Ⅱ 怎么清空socket 接收缓存区
清空socket缓存区的数据的方法
由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以Receive方法是这么工作的:
接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。
每次接收缓冲区都用同一个byte[] byteMessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。
socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个!
还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。
另一个是用fgetc,通过返回判断是否是feof:
whlie (1) { a=fgetc(f);if (feof(f)) break;//…
b=fgetc(f);if (feof(f)) break;//…}当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。