读书人

关于Socket 异步读取的小疑点有关问

发布时间: 2012-06-15 19:37:05 作者: rapoo

关于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

读书人网 >C#

热点推荐