protected void CloseClientSocket(SocketAsyncEventArgs e) { Close(() => { if (e.SocketError == SocketError.ConnectionReset) { if (this is GameClient) { ServerShutDown?.Invoke(this, e); Console.WriteLine("服务器主动断开"); } else { Console.WriteLine("客户端异常断开"); } } if (e.SocketError == SocketError.ConnectionAborted) { Console.WriteLine("网络断开"); ClientInternetError?.Invoke(this, e); } if (e.SocketError == SocketError.Success) { Console.WriteLine("客户端正常断开"); } DisconnectCompleted?.Invoke(this, e); }); }
//这是一个给收发异常准备的断开引发事件方法 private void Disconnected(bool raiseEvent) { if (raiseEvent) { DisconnectCompleted?.Invoke(this, new SocketEventArgs(this, SocketAsyncOperation.Disconnect)); } }
//客户端断开连接 private void client_DisconnectCompleted(object sender, SocketEventArgs e) { //移除客户端 lock (clients) clients.Remove((TCPListenerClient)e.Socket); e.Socket.DisconnectCompleted -= client_DisconnectCompleted; e.Socket.ReceiveCompleted -= client_ReceiveCompleted; e.Socket.SendCompleted -= client_SendCompleted; DisconnectCompleted?.Invoke(this, e); }
//客户端断开连接 private void client_DisconnectCompleted(object sender, SocketAsyncEventArgs e) { Game.Network.UserToken userToken = e.UserToken as UserToken; //移除事件 userToken.DisconnectCompleted -= client_DisconnectCompleted; userToken.ReceiveCompleted -= client_ReceiveCompleted; userToken.SendCompleted -= client_SendCompleted; DisconnectCompleted?.Invoke(this, e); //移除客户端 m_UserTokenPool.Push(userToken); //增加一个信号量 m_maxNumberAcceptedClients.Release(); }
private void EndDisconnect(IAsyncResult result) { try { Socket.EndDisconnect(result); } catch { } //是否同步 bool sync = (bool)result.AsyncState; if (!sync) { DisconnectCompleted?.Invoke(this, new SocketEventArgs(this, SocketAsyncOperation.Disconnect)); } }