public ClientPacket(byte[] data) { data = NetworkSyntheticTesting.SyntheticCorruption_C2S(data); ParsePacketData(data); if (IsValid) { ReadFragments(); } }
private void SendPacketRaw(ServerPacket packet) { byte[] buffer = ArrayPool <byte> .Shared.Rent((int)(PacketHeader.HeaderSize + (packet.Data?.Length ?? 0) + (packet.Fragments.Count *PacketFragment.MaxFragementSize))); try { var socket = connectionListener.Socket; packet.CreateReadyToSendPacket(buffer, out var size); packetLog.Debug(packet.ToString()); buffer = NetworkSyntheticTesting.SyntheticCorruption_S2C(buffer); if (packetLog.IsDebugEnabled) { var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint; var sb = new StringBuilder(); sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", buffer.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId)); sb.AppendLine(buffer.BuildPacketString()); packetLog.Debug(sb.ToString()); } try { socket.SendTo(buffer, size, SocketFlags.None, session.EndPoint); } catch (SocketException ex) { // Unhandled Exception: System.Net.Sockets.SocketException: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself // at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName) // at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP) var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint; var sb = new StringBuilder(); sb.AppendLine(ex.ToString()); sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", buffer.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId)); log.Error(sb.ToString()); session.Terminate(SessionTerminationReason.SendToSocketException, null, null, ex.Message); } } finally { ArrayPool <byte> .Shared.Return(buffer, true); } }
public bool Unpack(byte[] data) { try { // This won't actually do anything by default unless some bools in NetworkSyntheticTesting are enabled manually data = NetworkSyntheticTesting.SyntheticCorruption_C2S(data); if (data.Length < PacketHeader.HeaderSize) { return(false); } Header.Unpack(data); if (Header.Size > data.Length - PacketHeader.HeaderSize) { return(false); } Data = new MemoryStream(data, PacketHeader.HeaderSize, Header.Size, false, true); DataReader = new BinaryReader(Data); HeaderOptional.Unpack(DataReader, Header); if (!HeaderOptional.IsValid) { return(false); } if (!ReadFragments()) { return(false); } return(true); } catch (Exception ex) { packetLog.Error("Invalid packet data", ex); return(false); } }
private void SendPacketRaw(ServerPacket packet) { Socket socket = SocketManager.GetMainSocket(); byte[] payload = packet.GetPayload(); #if NETDIAG payload = NetworkSyntheticTesting.SyntheticCorruption_S2C(payload); #endif if (packetLog.IsDebugEnabled) { var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint; var sb = new StringBuilder(); sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", payload.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId)); sb.AppendLine(payload.BuildPacketString()); packetLog.Debug(sb.ToString()); } try { socket.SendTo(payload, session.EndPoint); } catch (SocketException ex) { // Unhandled Exception: System.Net.Sockets.SocketException: A message sent on a datagram socket was larger than the internal message buffer or some other network limit, or the buffer used to receive a datagram into was smaller than the datagram itself // at System.Net.Sockets.Socket.UpdateStatusAfterSocketErrorAndThrowException(SocketError error, String callerName) // at System.Net.Sockets.Socket.SendTo(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags, EndPoint remoteEP) var listenerEndpoint = (System.Net.IPEndPoint)socket.LocalEndPoint; var sb = new StringBuilder(); sb.AppendLine(ex.ToString()); sb.AppendLine(String.Format("[{5}] Sending Packet (Len: {0}) [{1}:{2}=>{3}:{4}]", payload.Length, listenerEndpoint.Address, listenerEndpoint.Port, session.EndPoint.Address, session.EndPoint.Port, session.Network.ClientId)); log.Error(sb.ToString()); session.State = Enum.SessionState.NetworkTimeout; // This will force WorldManager to drop the session } }