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); } } } }
/// <summary> /// 更新Socket连接列表 /// </summary> /// <param name="state"></param> public void UpdateSocketList(StateObject state) { var find = false; try { var ip = (IPEndPoint)state.WorkSocket.RemoteEndPoint; var sl = new SocketList(); for (var i = 0; i < _socketAl.Count; i++) { if (!((SocketList)_socketAl[i]).Ipaddr.Equals(ip.Address)) { continue; } find = true; sl = (SocketList)_socketAl[i]; sl.Handler = state.WorkSocket; _socketAl[i] = sl; break; } if (!find) { sl.Handler = state.WorkSocket; sl.Ipaddr = ip.Address; _socketAl.Add(sl); } } catch (Exception ex) { Console.WriteLine("[EXCEPTION_ERROR] UpdateSocketList::" + ex.Message); } }
public void Close() { lock (SendLock) { if (listener != null) { try { listener.Shutdown(SocketShutdown.Both); } finally { listener.Close(); listener = null; } } StopThread(); SocketList.Clear(); Packets.Clear(); ToPeer.Clear(); SocketToKey.Clear(); clientcheck.Clear(); OnListenClient.Clear(); GetMessage = null; RSAkey = new EncryptAndCompress.RSAKeyPair(); } }
public void Close() { if (listener != null) { try { listener.Shutdown(SocketShutdown.Both); } catch (Exception) { } finally { listener.Close(); listener = null; } } SocketList.Clear(); Packets.Clear(); ToPeer.Clear(); SocketToEndPoint.Clear(); SocketToKey.Clear(); GetMessage = null; RSAkey = new EncryptAndCompress.RSAKeyPair(); }
public void ConnectSuccessful(Func <object, INetServer, PeerBase> AddPeerFunc, Packet packet) { SocketToKey.Add(packet.peer, (string)packet.state); PeerBase peer = AddPeerFunc(packet.peer, this); SocketList.Add(peer); SocketToEndPoint.Add(((Socket)packet.peer), ((Socket)packet.peer).RemoteEndPoint); ToPeer.Add(((Socket)packet.peer).RemoteEndPoint, peer); using (Packet newpacket = new Packet(packet.peer)) { packet.BeginWrite(PacketType.CONNECT_SUCCESSFUL); packet.WriteSendData(new SendData(0, "On Connect"), (string)packet.state, EncryptAndCompress.LockType.AES); Send(packet, packet.peer); } }
//Socket服务监听 void ListenSocket(object o) { Socket serverSocket = o as Socket; while (open) { acceptSocket = serverSocket.Accept(); SocketList.Add(acceptSocket); ShowMsg("连接成功!"); //创建新线程,执行接收消息的方法 Thread thread2 = new Thread(Received) { IsBackground = true }; thread2.Start(acceptSocket); } }
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; } } } }