From c21c92db37b3d9a414e263026e41d84cba75ad3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9F=D1=8B=D1=82=D0=BA=D0=BE=D0=B2=20=D0=A0=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD?= Date: Wed, 17 Sep 2025 12:39:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20magic-header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Client/TcpClient.cs | 22 ++++++++++++++++++++-- Server/TcpServer.cs | 3 +++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/Client/TcpClient.cs b/Client/TcpClient.cs index 592caa9..5a93a66 100644 --- a/Client/TcpClient.cs +++ b/Client/TcpClient.cs @@ -9,6 +9,7 @@ namespace Client; public class TcpClientWrapper : IClient { + private const uint MagicHeader = 0xDEADBEEF; private readonly string _host; private readonly int _port; private CancellationTokenSource _cts = new CancellationTokenSource(); @@ -16,7 +17,7 @@ public class TcpClientWrapper : IClient private Func>? _responseConverter; private TcpClient? _tcpClient; - public TcpClientWrapper(Func> responseConverter, string host = "192.168.1.117", int port = 5555) + public TcpClientWrapper(Func> responseConverter, string host = "localhost", int port = 5555) { _host = host; _port = port; @@ -51,9 +52,26 @@ public class TcpClientWrapper : IClient { try { + // Читаем magic header полностью + var magicBytes = new byte[4]; + int totalRead = 0; + while (totalRead < 4) + { + var read = await stream.ReadAsync(magicBytes, totalRead, 4 - totalRead, token); + if (read == 0) break; // соединение закрыто + totalRead += read; + } + if (totalRead < 4) break; + var magic = BitConverter.ToUInt32(magicBytes, 0); + if (magic != MagicHeader) + { + Console.WriteLine($"Invalid magic header: {magic:X8}, expected {MagicHeader:X8}. Skipping packet."); + continue; // or break, depending on policy + } + // Читаем длину полностью var lengthBytes = new byte[4]; - int totalRead = 0; + totalRead = 0; while (totalRead < 4) { var read = await stream.ReadAsync(lengthBytes, totalRead, 4 - totalRead, token); diff --git a/Server/TcpServer.cs b/Server/TcpServer.cs index 122fcc1..6032142 100644 --- a/Server/TcpServer.cs +++ b/Server/TcpServer.cs @@ -10,6 +10,7 @@ namespace NetworkTest; public class TcpServer : IServer { + private const uint MagicHeader = 0xDEADBEEF; private readonly TcpListener _listener; private readonly Func _getData; private readonly Func _prepareBytes; @@ -69,7 +70,9 @@ public class TcpServer : IServer if (data != null) { var bytes = _prepareBytes(data); + var magicBytes = BitConverter.GetBytes(MagicHeader); var lengthBytes = BitConverter.GetBytes(bytes.Length); + await stream.WriteAsync(magicBytes, 0, magicBytes.Length, token); await stream.WriteAsync(lengthBytes, 0, lengthBytes.Length, token); await stream.WriteAsync(bytes, 0, bytes.Length, token); index++;