C# 如何构造自定义二进制协议TCP请求

C# 如何构造自定义二进制协议TCP请求,c#,tcp,protocols,C#,Tcp,Protocols,我正在处理一个代码挑战,简言之,它提供了一个对请求中发送的数据进行编码/解码的服务器。它是具有以下自定义二进制请求/响应结构的TCP/IP服务器: 我需要创建一个桌面客户端,它将发送请求和接收响应,并相应地显示数据。我很难理解如何形成请求,以及如何将请求发送到TCP/IP服务器(使用C#)。是否有人可以提供一个这样的例子?不确定您的校验和,但构建一个数据包会是这样的 byte[] CreatePacket(string s, Operation op) {

我正在处理一个代码挑战,简言之,它提供了一个对请求中发送的数据进行编码/解码的服务器。它是具有以下自定义二进制请求/响应结构的TCP/IP服务器:


我需要创建一个桌面客户端,它将发送请求和接收响应,并相应地显示数据。我很难理解如何形成请求,以及如何将请求发送到TCP/IP服务器(使用C#)。是否有人可以提供一个这样的例子?

不确定您的校验和,但构建一个数据包会是这样的

        byte[] CreatePacket(string s, Operation op)
        {
            var packet = new List<byte>();
            packet.AddRange(BitConverter.GetBytes((UInt16) 0x1092));
            packet.Add(1);
            var data = Encoding.ASCII.GetBytes(s);
            packet.AddRange(BitConverter.GetBytes((UInt32) (9 + data.Length)));
            packet.Add((byte) (op == Operation.Encode ? 1 : 2));
            packet.AddRange(data);
            packet.Add(CheckSum(packet));
            return packet.ToArray();
        }

还有校验和规范

        byte CheckSum(List<byte> packet)
        {
            return (byte)(packet.Select((b, i) => (value: b, index: i))
                .Sum(o => (o.value & (1 << (o.index % 8))) > 0 ? 1 :0) % 256);
        }
字节校验和(列表数据包)
{
返回(字节)(数据包选择((b,i)=>(值:b,索引:i))
.Sum(o=>(o.value&(10-1:0)%256);
}

不确定您的校验和,但构建数据包看起来像

        byte[] CreatePacket(string s, Operation op)
        {
            var packet = new List<byte>();
            packet.AddRange(BitConverter.GetBytes((UInt16) 0x1092));
            packet.Add(1);
            var data = Encoding.ASCII.GetBytes(s);
            packet.AddRange(BitConverter.GetBytes((UInt32) (9 + data.Length)));
            packet.Add((byte) (op == Operation.Encode ? 1 : 2));
            packet.AddRange(data);
            packet.Add(CheckSum(packet));
            return packet.ToArray();
        }

还有校验和规范

        byte CheckSum(List<byte> packet)
        {
            return (byte)(packet.Select((b, i) => (value: b, index: i))
                .Sum(o => (o.value & (1 << (o.index % 8))) > 0 ? 1 :0) % 256);
        }
字节校验和(列表数据包)
{
返回(字节)(数据包选择((b,i)=>(值:b,索引:i))
.Sum(o=>(o.value&(10-1:0)%256);
}

所以你在整个事情上遇到了麻烦?在谷歌搜索“C#byte array”和“C#send bytes TCP”之后,你在哪里遇到了问题?我一直在理解请求应该是什么样子。如果我有一个示例请求,我可能能够找到它。例如,如果我试图使用“测试字符串”作为数据,在请求表单中会是什么样子?那么你在整个事情上遇到了麻烦?在谷歌搜索“C#byte array”和“C#send bytes TCP”之后,你在哪里卡住了?我一直在理解请求应该是什么样子。如果我有一个示例请求,我可能能够找到它。例如,如果我试图使用“测试字符串”作为数据,在请求形式中是什么样子的?FWIW,校验和是通过循环遍历每个字节并根据被评估的字节计算特定位置的字节位来计算的。该校验和特别是-对于请求/响应中的第一个字节,计算第一位置的位。如果评估值为1,则将校验和增加1。如果评估值为0,则不执行任何操作。-对于请求/响应中的第二个字节,请在第二个位置评估该位。如果评估值为1,则将校验和增加1。如果评估值为0,则不执行任何操作。此外,您的解决方案是否考虑了这一事实长度方面需要little endian UInt32吗?默认情况下,它是little endian。但它可以在其他平台上更改(我不确定是否有与之不同的平台),您可以使用类似于
Console.WriteLine(BitConverter.IsLittleEndian)的内容查看平台上的内容
另外,我不确定校验和的定义,我做了一些假设,所以可能有效,也可能无效,FWIW,校验和是通过循环每个字节并根据被评估的字节在特定位置计算字节的一位来计算的。这个校验和特别是-对于请求/响应中的第一个字节,计算t位在第一个位置。如果被评估的位为1,则将校验和增加1。如果被评估的位为0,则不执行任何操作。-对于请求/响应中的第二个字节,请评估第二个位置的位。如果被评估的位为1,则将校验和增加1。如果被评估的位为0,则不执行任何操作。此外,是否你的解决方案考虑到这样一个事实,即长度方面需要little endian UInt32?默认情况下,它是little endian。但它可以在其他平台上更改(我不确定是否有与之不同的平台)。你可以使用类似
Console.WriteLine(BitConverter.IsLittleEndian)的东西查看它在你的平台上是什么
另外,我不确定校验和的定义,我做了一些假设,所以可能有效,也可能无效,