日期:2014-05-16  浏览次数:20920 次

NetWorkStream.Read() 的问题 。
本帖最后由 dota3c 于 2014-03-11 21:44:59 编辑
我写了C/S的抓包程序,大概工作机制是这样的:服务器端不停的将抓到数据包的包头提取出来,刚好是61个字节,用TCP协议发送给客户端,客户端用61个字节的缓存去读,为什么有时候读取的字节数不是61呢?(大多数时候是正常的)。

服务器端采用异地发送方式:

byte[] buffer=new byte[61];
//....将抓到包头放进去
ns.BeginWrite(buffer,0,buffer.Length,sendCallBack,this);

客户端的代码是:

byte[] buffer=new byte[61];
int numOfBytesRead=ns.Read(buffer,0,buffer.Length);
if(numOfBytesRead==61)
{
//有时候会出现numOfBytesRead=16 ,26的情况
//分析这个数据包,

}


这是为什么呢?
------解决方案--------------------
这正常呀,TCP会把数据包分成多个包分开发,所以有时你收到的是16,而有时会把两个包粘在一起,一起发过来。
------解决方案--------------------
哦 我理解你的意思了 你是说外面还会有个循环机制
引用:
...
我这是个循环读的呀,剩下的数据下一次读就可以了吧,应该不会丢吧


理论上可以, 但你要保证ns一直有效