如何在C# Socket发送的消息中填充空值(NUL)?
问题描述
我要复刻一个通过TCP/IP给远程Socket发数据的应用(原应用逻辑未公开)。用Wireshark抓包发现,原应用发送的数据末尾是00 00 00 38(对应Data字段)。
我写了一段C#代码尝试模拟,但抓包结果只显示38,缺了前面三个00,远程主机无法识别消息。现有代码如下:
try { IPAddress ip = IPAddress.Parse(ip); IPEndPoint ipEndPoint = new(ip, 7096); using Socket client = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await client.ConnectAsync(ipEndPoint); // Send message. var message = "8"; var messageBytes = Encoding.UTF8.GetBytes(message); client.SendTimeout = 10000; client.ReceiveTimeout = 10000; _ = await client.SendAsync(messageBytes, SocketFlags.None); client.Send(messageBytes, SocketFlags.None); Console.WriteLine($"Socket client sent message: \"{message}\""); // Receive ack. var buffer = new byte[1_024]; var received = client.Receive(buffer, SocketFlags.None); var response = Encoding.UTF8.GetString(buffer, 0, received); if (!string.IsNullOrEmpty(response)) { Console.WriteLine($"Socket client received acknowledgment: \"{response}\""); } else { Console.WriteLine("Response is empty"); } client.Shutdown(SocketShutdown.Both); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine();
我需要在38前加上三个00(即ASCII的NUL字符),但不知道在C#中怎么实现。
解决方案
直接构造目标字节数组即可,不用通过字符串转码,这样能精准匹配抓包到的字节序列。修改后的代码如下:
try { // 替换为实际的目标IP地址 string targetIp = "xxx.xxx.xxx.xxx"; IPAddress ip = IPAddress.Parse(targetIp); IPEndPoint ipEndPoint = new(ip, 7096); using Socket client = new Socket(ipEndPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); await client.ConnectAsync(ipEndPoint); // 直接构造需要发送的字节:00 00 00 38 byte[] messageBytes = new byte[] { 0x00, 0x00, 0x00, 0x38 }; client.SendTimeout = 10000; client.ReceiveTimeout = 10000; // 只发送一次即可,原代码重复发送会导致数据格式错误 int sentBytes = await client.SendAsync(messageBytes, SocketFlags.None); Console.WriteLine($"Socket client sent {sentBytes} bytes: 00 00 00 38"); // 接收响应 var buffer = new byte[1_024]; var received = client.Receive(buffer, SocketFlags.None); var response = Encoding.UTF8.GetString(buffer, 0, received); if (!string.IsNullOrEmpty(response)) { Console.WriteLine($"Socket client received acknowledgment: \"{response}\""); } else { Console.WriteLine("Response is empty"); } client.Shutdown(SocketShutdown.Both); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.ReadLine();
核心修改说明:
- 直接创建字节数组
new byte[] { 0x00, 0x00, 0x00, 0x38 },完全匹配抓包到的内容 - 删除原代码中重复发送的
client.Send(messageBytes, SocketFlags.None);,避免发送两次数据导致格式错误 - 修复了原代码中
IPAddress.Parse(ip)的变量名重复问题,替换为明确的targetIp变量
内容的提问来源于stack exchange,提问作者TriedAtLeast
相关产品推荐
相关产品推荐

