TCP/IP异步通讯,如果我连续调用两次BeginRead,结果很奇怪,为什么啊?

为了测试异步通讯方法的过程,我把服务器端一个TcpClient的ReceiveBufferSize设置成2个字节大小。然后客户端一次发送8个字节大小的数据,比如"12345678",在接收的时候,ReadCallback回调函数里面我连续调用两次NetWrokStream.BeginRead,比如ReadCallback部分内容是:

private void ReadCallback(IAsyncResult ar)
{
//...
int count = netStream.EndRead(ar);
Console.WriteLine(string.Format("[长度为{0}]{1}",count, System.Text.Encoding.UTF8.GetString(netStream.data.Bytes, 0, count)));
netStream.BeginRead(data.Bytes, 0, data.Bytes.Length,new AsyncCallback(ReadCallback),netStream);
netStream.BeginRead(data.Bytes, 0, data.Bytes.Length,new AsyncCallback(ReadCallback),netStream);
//...
}
得到的结果是:
[长度为2]12
[长度为2]56
[长度为2]78
[长度为2]78

为什么啊。。。到底连续调用两次BeginRead,实际上是发生了什么啊?正确接收数据的代码我会写,但是就想弄明白这个问题,以便于了解BeginRead的真正内核。
针对1楼的补充是,那么为什么第二次收到的是56呢?

第1个回答  2008-12-01
这个结果很正常,最后一个接受到“78”是socket缓存里面的,你的socket没断开,不会清除缓存

TCP\/IP异步通讯,如果我连续调用两次BeginRead,结果很奇怪,为什么啊?
这个结果很正常,最后一个接受到“78”是socket缓存里面的,你的socket没断开,不会清除缓存

如何用socket实现TcpListener.pending的功能
\/\/IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName()); \/\/IPAddress ipAddress = ipHostInfo.AddressList[0]; IPAddress ipAddress = IPAddress.Parse("127.0.0.1"); IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000); \/\/ Create a TCP\/IP socket. Socket listener = new Socket(AddressF...

C#socket异步怎么实现 线程间通信如何实现
(1)调用BeginAccetpTcpClient方法开开始连接新的连接,当连接视图发生时,回调函数被调用以完成连接操作;(2)上面DoAcceptTcpCliet方法通过AsyncState属性获得由BeginAcceptTcpClient传入的listner实例;(3)在得到listener对象后,用它调用EndAcceptTcpClient方法,该方法返回新的包含客户端信息的TcpClient。 BeginConnect方法和EndConn...

如何用visual studio2012来实现socket通信
下面是一段是BeginConnect的调用:Socketsocket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp)IPAddressip=IPAddress.Parse("127.0.0.1");IPEndPointiep=newIPEndPoint(ip,13000);socket.BeginConnect(iep,newAsyncCallback(Connect),socket); EndConnect是一种阻塞方法,用于完成BeginConnect方法的异...

相似回答