使用Socket会遇到的问题--Problems with data buffers
//如果Data buffer 过大
int rec=Socket.Receive(data);
string sdata=Encoding.ASCII.GetStrting(data,0,rec);
注意:
GetString()方法,使用最近放入data数组的数据。所以,rec参数可以确保使用的是最近接收到的数据,如果data在Socket.Receive()前,接收过数据,那么这一点就极为重要,因为data中的数据不止是Socket.Receive()的数据。
对于有2条Incoming数据,任何一条的长度都小于1024个字节,那么上面的方法,会造成收到的数据mix,即2条信息在同一个byte[]中。
//如果data buffer过小
Windows系统的Tcp子系统有自己的Tcp Buffer,用这个Buffer同时作为发送和接收数据用。
所有的Receive()和Send()都用同一个TcpBuffer。
对于Incoming data,存在于Tcp Buffer,直到有Receive()读取。如果Receive()不能够一次读完TcpBuffer中的信息,那么里面的数据会stay safe,直到被Receive(),不会因为多次Receive()而Lost。但是会出现问题,就是不见的会得到想要的data
因为如果data buffer过小,读数据需要多次读取,第一次读取data大小的数据,剩余的数据等待第2次Receive(),而对于Tcp系统,一直在传输数据,如果在第一次Receive()后,第2次前,Tcp收到新的数据,那么Tcp Buffer中的数据增加,第2次Receive()读取的数据发生了变化。
对于上面的蓝色字体段落,本人认为,应为系统收到的信息都是顺序的放入Tcp Buffer中,所以不存在用小的data buffer读取数据产生mixed的问题,经过测试,也证明了这一点,会遇到的问题,只是没有办法确定每条信息的边界。
//
过小的data buffer会造成数据mismatch,过大的会造成数据mixed。
参考:
Sybex C# Network Programming