//接收回调 private void ReceiveCb(IAsyncResult ar) { Conn conn = (Conn)ar.AsyncState; lock (conn) { try { int count = conn.socket.EndReceive(ar); //关闭信号 if (count <= 0) { Console.WriteLine("收到 [" + conn.GetAddress() + "] 断开连接"); ServerSQL.instance.OfflineMsgShow(conn.player.username); conn.Close(); return; } conn.buffCount += count; ProcessData(conn); //继续接收 conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.buffRemain(), SocketFlags.None, ReceiveCb, conn); } catch (Exception e) { Console.WriteLine("收到 [" + conn.GetAddress() + "] 断开连接" + e.Message); conn.Close(); } } }
//Accept回调 private void AcceptCb(IAsyncResult ar) { try { Socket socket = listenfd.EndAccept(ar); int index = NewIndex(); if (index < 0) { socket.Close(); Console.WriteLine("[警告] 连接已达到上限"); } else { Conn conn = conns[index]; conn.Init(socket); string adr = conn.GetAddress(); Console.WriteLine("新客户端连接 [" + adr + "]"); conn.socket.BeginReceive(conn.readBuff, conn.buffCount, conn.buffRemain(), SocketFlags.None, ReceiveCb, conn); } listenfd.BeginAccept(AcceptCb, null); } catch (Exception e) { Console.WriteLine("AcceptCb 失败:" + e.Message); } }