public void Disconnect(object socket, int timeout) { if (socket != null) { if (ToPeer.ContainsKey((EndPoint)socket)) { if (SocketList.Contains(ToPeer[(EndPoint)socket])) { SocketList.Remove(ToPeer[(EndPoint)socket]); } } if (SocketToKey.ContainsKey((EndPoint)socket)) { SocketToKey.Remove((EndPoint)socket); } if (ToPeer.ContainsKey((EndPoint)socket)) { ToPeer.Remove((EndPoint)socket); } lock (checklock) { if (clientcheck.ContainsKey((EndPoint)socket)) { clientcheck.Remove((EndPoint)socket); } } } }
public void Disconnect(object socket, int timeout) { if (socket != null) { if (SocketToEndPoint.ContainsKey((Socket)socket)) { if (ToPeer.ContainsKey(SocketToEndPoint[(Socket)socket])) { if (SocketList.Contains(ToPeer[SocketToEndPoint[(Socket)socket]])) { SocketList.Remove(ToPeer[SocketToEndPoint[(Socket)socket]]); } } if (SocketToKey.ContainsKey(socket)) { SocketToKey.Remove(socket); } if (ToPeer.ContainsKey(SocketToEndPoint[(Socket)socket])) { ToPeer.Remove(SocketToEndPoint[(Socket)socket]); } } try { ((Socket)socket).Shutdown(SocketShutdown.Both); } catch (Exception e) { GetMessage(e.Message); } finally { if (timeout == -1) { ((Socket)socket).Close(); } else { ((Socket)socket).Close(timeout); } socket = null; } } }
private void Receive(IAsyncResult ar) { object[] state = (object[])ar.AsyncState; Socket client = (Socket)state[0]; byte[] data = (byte[])state[1]; PacketType msgid = (PacketType)(-1); Packet packet = null; try { int len = client.EndReceive(ar); if (!SocketList.Contains(ToPeer[SocketToEndPoint[client]])) { PushPacket(PacketType.CONNECTION_LOST, "連線已關閉", client); return; } // 伺服器斷開連接 if (len < 1) { PushPacket(PacketType.CONNECTION_LOST, "遠端已斷線", client); return; } byte[] databody = ReadSocketData(BitConverter.ToInt32(data, 0), client); packet = new Packet(client, databody, null, true); msgid = packet.BeginRead(); packet.ResetPosition(); if (data.Length != Packet.header_length) { data = new byte[Packet.header_length]; } client.BeginReceive(data, 0, Packet.header_length, SocketFlags.None, Receive, new object[] { client, data }); } catch (Exception e) { PushPacket(PacketType.CONNECTION_LOST, e.ToString(), client); return; } if (msgid > PacketType.SendAllowTypeTop && msgid < PacketType.SendAllowTypeEnd) { PushPacket(packet); } else { switch (msgid) { case PacketType.CONNECTION_LOST: { packet.BeginRead(); SendData sendData = packet.ReadSendData(""); PushPacket(PacketType.CONNECTION_LOST, sendData.DebugMessage, client); packet.CloseStream(); break; } case PacketType.ClientDebugMessage: { packet.BeginRead(); SendData sendData = packet.ReadSendData(SocketToKey[packet.peer]); DebugMessage("ClientDebugMessage:" + packet.peer.ToString() + " " + sendData.DebugMessage); packet.CloseStream(); break; } default: { PushPacket(PacketType.CONNECTION_LOST, "不正確的標頭資訊 Receive", client); packet.CloseStream(); break; } } } }