예제 #1
0
 public void OnSelectRead()
 {
     try
     {
         if (m_InputStream.IsFull())
         {
             return;
         }
         //客户端主动断开连接,也会是可读
         if (m_Client.Connected == false || m_Client.Available == 0)
         {
             Shutdown();
             return;
         }
         SocketError err       = SocketError.Success;
         int         offset    = m_InputStream.GetWriteIndex();
         int         size      = Math.Min(m_InputStream.GetLeftSizeToWrite(), m_temp.Length);
         int         recvSize  = m_Client.Receive(m_temp, 0, size, SocketFlags.None, out err);
         int         writeSize = m_InputStream.WriteBuffer(m_temp, recvSize);
         if (writeSize != recvSize)
         {
             LogModule.LogInfo("Fatal Error, recvSize != writeSize, socket error : {0}", err);
             Shutdown();
         }
         else
         {
             IPEndPoint ip = m_Client.RemoteEndPoint as IPEndPoint;
             LogModule.LogInfo("Recv data from client : {0}, port : {1}, size : {2}", ip.Address, ip.Port, recvSize);
         }
     }
     catch (Exception e)
     {
         LogModule.LogInfo("OnSelectRead, exception message : {0}", e.Message);
     }
 }
예제 #2
0
        public bool Start(int port)
        {
            try
            {
                Clear();
                m_Port = port;

                IPHostEntry ipHostEntry = Dns.GetHostEntry(Dns.GetHostName());
                IPAddress   ipAddress   = new IPAddress(new byte[] { 10, 12, 5, 162 });
                m_Listener             = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                m_Listener.NoDelay     = true;
                m_Listener.LingerState = new LingerOption(false, 0);
                m_Listener.Blocking    = false;
                m_Listener.Bind(new IPEndPoint(ipAddress, m_Port));
                m_Listener.Listen(10); /// for 10 clients at most one time.

                LogModule.LogInfo("Start Tcp Listener succeed on port: {0}, ip: {1}", port, ipAddress.ToString());
                return(true);
            }
            catch (SocketException e)
            {
                LogModule.LogInfo("Start Tcp Listener failed on port: {0}, Message: {1}", m_Port, e.Message);
            }
            catch (Exception e)
            {
                LogModule.LogInfo("Catch an exception , Message : {0}", e.Message);
            }
            return(false);
        }
예제 #3
0
 public void SendPacket(Packet packet)
 {
     try
     {
         if (m_OutputStream.IsFull())
         {
             return;
         }
         m_tempStreamSend.Seek(0, SeekOrigin.Begin);
         m_tempStreamSend.SetLength(0);
         Serializer.Serialize(m_tempStreamSend, packet.GetData());
         ushort size = (ushort)m_tempStreamSend.Position;
         size += c_headSize;
         GetBytes((short)size, m_tempSend, 0);
         GetBytes((short)packet.GetPacketId(), m_tempSend, 2);
         int leftSize = m_OutputStream.GetLeftSizeToWrite();
         if (leftSize > size)
         {
             m_OutputStream.WriteBuffer(m_tempSend, size);
             LogModule.LogInfo("SendPacket, Packet id : {0}, size : {1}", packet.GetPacketId(), size);
         }
         else
         {
             LogModule.LogInfo("SendPacket, Output stream is not enough, Left : {0}, Require : {1}", leftSize, size);
         }
         packet.IsInUse = false;
     }
     catch (Exception e)
     {
         LogModule.LogInfo("SendPacket, Error : {0}", e.Message);
     }
 }
예제 #4
0
        public void Tick()
        {
            try
            {
                var    packet = CreatePacket <Person>(Packets.PacketIdDefine.Test);
                Person p      = packet.GetData() as Person;
                p.Id            = 222222;
                p.Name          = "mordyyyy";
                p.Address       = new Address();
                p.Address.Line1 = "ddddd";
                p.Address.Line2 = "ttttt";

                for (int i = 0; i < m_ConnectList.Count; i++)
                {
                    if (m_ConnectList[i].Client != null)
                    {
                        m_ConnectList[i].SendPacket(packet);
                    }
                }
            }
            catch (Exception e)
            {
                LogModule.LogInfo("Select error, Message:{0}", e.Message);
            }
        }
예제 #5
0
 public IPacketFactory GetPacketFactory(PacketIdDefine id)
 {
     if (m_Packets.ContainsKey(id))
     {
         return(m_Packets[id]);
     }
     LogModule.LogInfo("Can't find packet factory for id enum : {0}", id);
     return(null);
 }
예제 #6
0
 public IPacketHandler GetPacketHandler(PacketIdDefine id)
 {
     if (m_Handlers.ContainsKey(id))
     {
         IPacketHandler handler = m_Handlers[id];
         return(handler);
     }
     LogModule.LogInfo("Can't find packet handler for id enum : {0}", id);
     return(null);
 }
예제 #7
0
 public void Shutdown()
 {
     if (m_Client != null)
     {
         IPEndPoint ip = m_Client.RemoteEndPoint as IPEndPoint;
         LogModule.LogInfo("On connection shut down, ip : {0} , port : {1}", ip.Address, ip.Port);
         m_Client.Close();
         m_Client = null;
     }
     Clear();
 }
예제 #8
0
        public PacketBase <T> CreatePacket <T>(PacketIdDefine id) where T : new()
        {
            PacketIdDefine key = id;

            if (m_Packets.ContainsKey(key))
            {
                IPacketFactory factory = m_Packets[key];
                return(factory.CreatePacket() as PacketBase <T>);
            }
            LogModule.LogInfo("Can't find packet factory for type : {0}", key);
            return(null);
        }
예제 #9
0
        public void ProcessCommands(ConnectManager connMan)
        {
            // 一次最多执行10个
            for (int i = 0; i < 10; i++)
            {
                if (!m_InputStream.HasData())
                {
                    return;
                }
                int size = m_InputStream.TryReadBuffer(m_temp);
                //parse packet id and length
                if (size < 4)
                {
                    return;
                }
                ushort len      = BitConverter.ToUInt16(m_temp, 0);
                ushort packetId = BitConverter.ToUInt16(m_temp, 2);
                if (size < len)
                {
                    //还没接收完或者包不完整
                    return;
                }
                m_InputStream.SetReadIndex(len);

                try
                {
                    // 调用handle
                    IPacketFactory factory = connMan.GetPacketFactory((Packets.PacketIdDefine)packetId);
                    if (factory != null)
                    {
                        m_tempStream.Seek(0, SeekOrigin.Begin);
                        m_tempStream.SetLength(len - c_headSize);
                        object         data    = Serializer.Deserialize(factory.GetDataType(), m_tempStream);//GC狂魔
                        IPacketHandler handler = connMan.GetPacketHandler((Packets.PacketIdDefine)packetId);
                        if (handler != null)
                        {
                            handler.Handle(this, data);
                        }
                    }
                }
                catch (Exception e)
                {
                    LogModule.LogInfo("Handle packet error, Packet id : {0}, len : {1}, msg : {2}", packetId, len, e.Message);
                    Shutdown();
                    break;
                }
            }
        }
예제 #10
0
 public void Select()
 {
     try
     {
         bool hasData = GetClientList(m_ErrorCheck);
         hasData = hasData && GetClientList(m_ReadCheck);
         hasData = hasData && GetClientList(m_WriteCheck);
         if (hasData)
         {
             Socket.Select(m_ReadCheck, m_WriteCheck, m_ErrorCheck, 0);
         }
     }
     catch (Exception e)
     {
         LogModule.LogInfo(string.Format("Select call error, meassage : {0}", e.Message));
     }
 }
예제 #11
0
        public void OnSelectError()
        {
            SocketError err = (SocketError)m_Client.GetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.Error);

            if (err == SocketError.AlreadyInProgress ||
                err == SocketError.Success ||
                err == SocketError.WouldBlock ||
                err == SocketError.AlreadyInProgress ||
                err == SocketError.IsConnected ||
                err == SocketError.IOPending)
            {
                return;
            }

            LogModule.LogInfo("OnSelectError : {0}", err);

            Shutdown();
        }
예제 #12
0
 public void OnSelectWrite()
 {
     try
     {
         if (!m_OutputStream.HasData())
         {
             return;
         }
         SocketError err      = SocketError.Success;
         int         offset   = m_OutputStream.GetReadIndex();
         int         size     = m_OutputStream.TryReadBuffer(m_tempSend);
         int         sendSize = m_Client.Send(m_tempSend, 0, size, SocketFlags.None, out err);
         m_OutputStream.SetReadIndex(sendSize);
     }
     catch (Exception e)
     {
         LogModule.LogInfo("OnSelectWrite, exception message : {0}", e.Message);
     }
 }
예제 #13
0
        public void Tick()
        {
            try
            {
                GetListenList(m_Listeners);
                Socket.Select(null, null, m_Listeners, 0);
                bool bError = m_Listeners.Count > 0;
                if (bError)
                {
                    return;
                }

                GetListenList(m_Listeners);
                Socket.Select(m_Listeners, null, null, 0);
                bool bCanRead = m_Listeners.Count > 0;
                if (!bCanRead)
                {
                    return;
                }

                Socket newClient = m_Listener.Accept();
                if (newClient != null)
                {
                    if (m_AcceptDelegate != null)
                    {
                        m_AcceptDelegate(newClient);
                    }
                    IPEndPoint ip = (IPEndPoint)newClient.RemoteEndPoint;
                    LogModule.LogInfo("Accept one client, ip={0}, port={1}", ip.Address, ip.Port);
                }
            }
            catch (Exception e)
            {
                LogModule.LogInfo("Accept client error, Message:{0}", e.Message);
            }
        }
예제 #14
0
        public void Handle(ConnectInstance conn, object data)
        {
            Person p = data as Person;

            LogModule.LogInfo("PacketTestHandler handled!, {0}, {1}, {2}, {3}", p.Id, p.Name, p.Address.Line1, p.Address.Line2);
        }