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); } }
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); }
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); } }
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); } }
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); }
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); }
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(); }
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); }
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; } } }
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)); } }
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(); }
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); } }
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); } }
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); }