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

为何我的C# TCP客户端偶尔会接收乱码数据?

问题:TCP客户端接收连续数据时频繁乱码

服务器几乎同时发送两条数据时,C#客户端接收第二条数据有约75%的概率出现乱码。

经排查:

  • 服务器输出缓冲区数据正常
  • Wireshark抓包验证传输的数据无误
  • 改用Python客户端接收数据完全正常
    因此确定问题出在当前C#客户端实现中。

尝试过的解决方法及效果:

  • 接收时清空缓冲区:无效果
  • 在接收函数前添加延迟:虽能解决问题,但游戏应用需要低延迟,且无法确定合适的延迟时长,该方案不适用

以下是基于Godot的客户端网络相关代码(已剔除非接收相关代码):

public partial class Network : Node
{
    public bool error = false; // 发生错误标记

    private Socket socket = null; // Socket实例
    private Change change = new Change(); // 负责数据包与字节数组转换的工具类
    private byte[] buffer = new byte[64]; // 接收缓冲区
    private List<Tuple<object, PackageType>> packageGet = new List<Tuple<object, PackageType>>(); // 已接收未处理的数据包列表

    public override void _ExitTree()
    {
        close();
    }

    public override void _Process(double delta)
    {
        if (!updated && packageGet.Count > 0)
        {
            handleEvent();
        }
    }

    /**
     * @brief 连接到服务器
     * @param ipParameter 服务器IP地址
     * @return 连接结果
     */
    public bool connect(string ipParameter)
    {
        close();
        socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        try
        {
            if (!socket.ConnectAsync(ipParameter, 10000).Wait(ConfigPanel.connectTime))
            {
                return false;
            }
        }
        catch
        {
            return false;
        }

        startRead();
        
        return true;
    }

    /**
     * @brief 关闭Socket连接
     */
    public void close()
    {
        if (socket != null && socket.Connected)
        {
            socket.Shutdown(SocketShutdown.Both);
            socket.Close();
        }
    }

    /**
     * @brief 开始从服务器读取数据
     */
    private void startRead()
    {
        Array.Clear(buffer, 0, buffer.Length);
        socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, read, null);
    }

    /**
     * @brief 读取数据的回调函数(由startRead触发)
     * @param resultParameter 异步操作结果
     */
    private void read(IAsyncResult resultParameter)
    {
        try
        {
            if (!socket.Connected || socket == null)
            {
                return;
            }

            int length = socket.EndReceive(resultParameter);

            if (length == 0)
            {
                close();
                // 错误处理
                return;
            }

            PackageType type = PackageType.None;
            object package = change.toPackage(buffer, ref type);
            packageGet.Add(new Tuple<object, PackageType>(package, type));
            startRead();
        }
        catch
        {
            // 错误处理
        }
    }

    /**
     * @brief 处理接收到的数据包事件
     */
    private void handleEvent()
    {
        // 数据包处理逻辑
    }
}

内容的提问来源于stack exchange,提问作者SEU

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 14:32:34