You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:25:27