日期:2014-05-18  浏览次数:20911 次

关于Socket 异步读取的小问题,在线等,问题解决立即给分
先贴下源码
C# code

public static ManualResetEvent HallallDone = new ManualResetEvent(false);
byte[] recByte = new byte[1024];
private TcpClient hallclient;
private void readhallclient()
{
      HallallDone.WaitOne();
      AsyncCallback GetStreamMsgCallback = new AsyncCallback(hallReadCallBack);
      hallclient.GetStream().BeginRead(recByte, 0, recByte.Length, GetStreamMsgCallback, null);
//出错的位置,报IO异常:无法从传输连接中读取数据: 由于系统缓冲区空间不足或列队已满,不能执行套接字上的操作。。
       readhallclient();
}
private void hallReadCallBack(IAsyncResult ar)
{
            
      int numberOfBytesRead;
      bool isFinish = true;
      try
      {
           lock ( hallclient.GetStream())
           {
                numberOfBytesRead = hallclient.GetStream().EndRead(ar);

                if (numberOfBytesRead < 1)
                {

                    Console.WriteLine("消息长度小于1----Player");
                    return;
                    }
                }

                sb.AddBytes(recByte, numberOfBytesRead);
                recByte = new byte[1024];

                if (hallclient.GetStream().DataAvailable)
                {
                    isFinish = false;
                    hallclient.GetStream().BeginRead(recByte, 0, recByte.Length, new AsyncCallback(hallReadCallBack), hallclient.GetStream());
                }

                if (isFinish)
                {
                    string msg = StrHelper.ascarr2str(sb.ReceiveAllByte);
                    msg = msg.TrimEnd('\0');
                    string result = listenedMsgEffect(msg,CodeControl.LocalCode.Localcode);
                    if (result!=null&&result != "")
                    {
                        writehallclient(result);
                    }
                    sb.Dispose();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }



出错位置在源码标记的位置报IO异常,我把recByte new成20000长度的就不会报异常了,请问这是什么原因,求教了

------解决方案--------------------
很明显,缓冲区不够了溢出报异常。底层收包可能是每次收1024个字节,但是一次完整包补一定是1024可以存下,如果返回是1025字节,而你给出的缓冲区是1024,就会溢出异常。
------解决方案--------------------
原因:WSABUF数据结构没有初始化!使用new来分配的,没有调用缺省的构造函数来初始化,所以导致这一问题。

------解决方案--------------------
http://blog.csdn.net/qiuqingpo/archive/2010/04/02/5445808.aspx