为何我的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
相关产品推荐
相关产品推荐

