首页 > 解决方案 > HTTP 未解析的 ping - TCP 服务器

问题描述

每隔 30 秒,我的 TCP 服务器会从我的 HTTP 客户端接收一个数据包,它们都是用 c# 编码的。这是控制台信息:

94:39:38 - [ERROR] Unhandeled: ???
14:39:38 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:39:38 - [ERROR] hex: 8980d6bb0d39
14:39:38 - [ERROR] cast: System.Byte[]  
14:40:08 - [ERROR] Unhandeled: ??????
14:40:08 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:40:08 - [ERROR] hex: 8980ad8fd4e3
14:40:08 - [ERROR] cast: System.Byte[]
14:40:38 - [ERROR] Unhandeled: ???3
k
14:40:38 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:40:38 - [ERROR] hex: 8980e3330a6b
14:40:38 - [ERROR] cast: System.Byte[]
14:41:08 - [ERROR] Unhandeled: ??]???
14:41:08 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:41:08 - [ERROR] hex: 89805da8aec9
14:41:08 - [ERROR] cast: System.Byte[]
14:41:38 - [ERROR] Unhandeled: ?????
14:41:38 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:41:38 - [ERROR] hex: 8980bea007ed
14:41:38 - [ERROR] cast: System.Byte[]
14:42:08 - [ERROR] Unhandeled: ???|?_
14:42:08 - [ERROR] fin: True | opcode: 9 | msglen: 0 | mask: True | arrayLength: 6
14:42:08 - [ERROR] hex: 8980b67cd35f
14:42:08 - [ERROR] cast: System.Byte[]

此日志由以下代码生成:

public void process(byte[] Data) {
     bool fin = (Data[0] & 0b10000000) != 0,
              mask = (Data[1] & 0b10000000) != 0;

     int opcode = Data[0] & 0b00001111, // expecting 1 - text message
     msglen = Data[1] - 128, // & 0111 1111
     offset = 2;

     if (msglen == 0)
     {
         log.Error($"Unhandeled: {Encoding.UTF8.GetString(Data)}");
         log.Error($"fin: {fin} | opcode: {opcode} | msglen: {msglen} | mask: {mask} | arrayLength: {Data.Length}");
         log.Error($"hex: {ByteArrayToHexString(Data)}");
         log.Error($"cast: {Data}");
         return null;
     }
}

在其中几个可能的 ping 之后,TCP 服务器将无法解析客户端发送的其他数据包,只能解析这些 ping。在这些 ping 中的任何一个之前,它最终都能够很好地解析数据包,但它不再是了。有谁知道如何防止这些假定的 ping 或如何处理它们,以便它们不会冻结它不会解析我的任何其他请求?

编辑:它还会停止处理 ping,直到创建新连接。该连接再次工作,直到几次 ping。

标签: c#httpservertcpclient

解决方案


推荐阅读