Example #1
0
 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);
             }
         }
     }
 }
Example #2
0
        /// <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);
            }
        }
Example #3
0
        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();
            }
        }
Example #4
0
        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();
        }
Example #5
0
        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);
            }
        }
Example #6
0
        //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);
            }
        }
Example #7
0
        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;
                }
            }
        }
Example #8
0
        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;
                }
                }
            }
        }