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

c# socket异步通信,该怎么处理

2012-08-14 
c# socket异步通信下面是我的c# socket异步接受发送数据的代码?第一次发送请求的时候,send数据是成功的,当

c# socket异步通信
下面是我的c# socket异步接受发送数据的代码?第一次发送请求的时候,send数据是成功的,当客户端点击按钮再次请求时,就会报“不可访问已释放资源”,有谁可不可以帮我修改一下啊,(客户端会发送很多次请求)
 public class StateObject
  {
  public Socket workSocket = null;

  public const int BufferSize = 1024;

  public byte[] buffer = new byte[BufferSize];

  public StringBuilder sb = new StringBuilder();
  }

  public class AsynchronousSocketListener
  {
  public static Thread mythread; //监听数据
  public static Thread mythreadReceive; //为每个用户创建新的进程

  public static IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
  public static IPAddress ipAddress = ipHostInfo.AddressList[0];
  public static string data = null;

  public static ManualResetEvent allDone = new ManualResetEvent(false);

  public AsynchronousSocketListener()
  {
  }

  public static void StartListening()
  {

  ipHostInfo = Dns.Resolve(Dns.GetHostName());
  ipAddress = ipHostInfo.AddressList[0];



  IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 843);

  Socket listener = new Socket(AddressFamily.InterNetwork,

  SocketType.Stream, ProtocolType.Tcp);
  try
  {
  listener.Bind(localEndPoint);
  listener.Listen(0);
  while (true)
  {

  allDone.Reset();
  Console.WriteLine("Waiting for a connection...");

  listener.BeginAccept(
  new AsyncCallback(AcceptCallback),
  listener);
  allDone.WaitOne();
  }

  }
  catch (Exception e)
  {
  Console.WriteLine(e.ToString());
  }
  // Console.WriteLine("Press ENTER to continue...");
  // Console.Read();

  }


  public static void AcceptCallback(IAsyncResult ar)
  {
  allDone.Set();
  Socket listener = (Socket)ar.AsyncState;
  Socket handler = listener.EndAccept(ar);
   
  StateObject state = new StateObject();
  state.workSocket = handler;


  handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
  new AsyncCallback(ReadCallback), state);
  }

  public static void ReadCallback(IAsyncResult ar)
  {
  String content = String.Empty;
  StateObject state = (StateObject)ar.AsyncState;
  Socket handler = state.workSocket;

  int bytesRead = handler.EndReceive(ar);
  if (bytesRead > 0)
  {
  state.sb.Append(Encoding.ASCII.GetString(
  state.buffer, 0, bytesRead));

  content = state.sb.ToString();

  Console.WriteLine("Read {0} bytes from socket.\n Data:{1}", content.Length, content);



  string xml = "<cross-domain-policy>";
  if (content.Length >= 22)
  {
   
  }
  Send(handler, xml);
  }
  }



  //向客户端传数据
  private static void Send(Socket handler, String data)
  {
  byte[] byteData = Encoding.ASCII.GetBytes(data);

  handler.BeginSend(byteData, 0, byteData.Length, 0,
  new AsyncCallback(SendCallback), handler);
  }

  private static void SendCallback(IAsyncResult ar)
  {
  try
  {
  Socket handler = (Socket)ar.AsyncState;

  int bytesSent = handler.EndSend(ar);
  Console.WriteLine("Sent {0} bytes to client.", bytesSent);
  handler.Shutdown(SocketShutdown.Both);
  handler.Close();
  }
  catch (Exception e)
  {
  Console.WriteLine(e.ToString());
  }
  }

[解决办法]
http://www.cnblogs.com/light169/articles/1240202.html
[解决办法]

探讨
handler.Shutdown(SocketShutdown.Both);
handler.Close();

注释掉这两行看看嘞?

热点排行