首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

异步套接字缓冲数组的有关问题

2012-01-20 
异步套接字缓冲数组的问题同步套接字接受数据的时候常常是:byte[] buffer new byte[64]string dataRece

异步套接字缓冲数组的问题
同步套接字接受数据的时候常常是:
byte[] buffer = new byte[64];
string dataReceived = "";
try
{
  while (true)
  {
  int bytesRead = sender.Receive(buffer);
  dataReceived += Encoding.UTF8.GetString(buffer, 0, bytesRead);
  if (dataReceived.IndexOf("\r\n") > -1)
  break;
  }
}
而如果异步套接字这样写,则会报错:
public void ReceiveMsg()
{
  byte[] buffer = new byte[64]; //缓冲字节数组
  serverSocket.BeginReceive(buffer,0,buffer.Length,SocketFlags.None,new AsyncCallback(receiveCallback),buffer);
}
private void receiveCallback(IAsyncResult ar)
{
  try
  {
  byte[] buffer = (byte[])ar.AsyncState; //缓冲字节数组
  StringBuilder sb = new StringBuilder();

  while (true)
  {
  int receivedLength = serverSocket.EndReceive(ar);
  sb.Append(Encoding.UTF8.GetString(buffer, 0, receivedLength));
  if (sb.ToString().IndexOf("\r\n") > -1)
  break;
  }
  string msgString = sb.ToString();
  msgString = msgString.Substring(0,msgString.IndexOf("\r\n"));
  Console.WriteLine("收到新消息:{0}",msgString);
  }
  catch (Exception e)
  {
  Console.WriteLine(" 接收数据失败:{0}", e.Message);
  }
  finally
  {
  ReceiveMsg(); //继续监听消息
  }
}

报错:只能为每个异步操作调用一次EndReceive。这样的话要接受的信息如果大于64字节就收不了。

[解决办法]

C# code
public void ReceiveMsg()        {            Thread t = new Thread(new ThreadStart(receiveCallback));            t.Start();        }        private void receiveCallback()        {byte[] buffer = new byte[64]; string dataReceived = ""; try {     while (true)     {         int bytesRead = sender.Receive(buffer);         dataReceived += Encoding.UTF8.GetString(buffer, 0, bytesRead);         if (dataReceived.IndexOf("\r\n")  > -1)             break;     } }      }
[解决办法]
C# code
StringBuilder sb = new StringBuilder(); byte[] buffer = new byte[64]; //缓冲字节数组 1 

热点排行