还是个学生 2022-04-22 15:00 采纳率: 50%
浏览 74
已结题

C# Socket tcp请求,怎么按照别人文档发送数据包??

第一次对接单片机,怎么按照文档描述下达指令?

img

我直接发送文档给的例子没有效果,但我保证自己写的客户端是能够与服务端通信的我自己写了一个demo;我感觉就是没按照格式发送才导致这样的结果,请问怎么发送文档描述的格式来请求?麻烦写一个请求的例子!!

img

  • 写回答

2条回答 默认 最新

  • wanghui0380 2022-04-22 17:10
    关注

    随手写一个,环境net4.62
    库:System.Buffers ,如果没有请nuget

    public class XXProtocol
    {
        private static int PackageIndex = 0;
        private static readonly object lockobj = new object();
        /// <summary>
        /// 因为是展示我也不打算给这个协议封啥对象了,单纯
        /// 就事论事写个编码方法,参数也是就事论事的这么写
        /// </summary>
        /// <param name="packagetype"></param>
        /// <param name="json"></param>
        /// <param name="encoding"></param>
        /// <returns></returns>
        public static ReadOnlySpan<byte> Encode(int packagetype, string json, Encoding encoding)
        {
    
            json = json.ToLower();
            var databuffer = encoding.GetBytes(json);
            var datalength = databuffer.Length;
            var buffer = new byte[datalength + 8];
            using (MemoryStream ms = new MemoryStream(buffer))
            {
                using (BinaryWriter writer = new BinaryWriter(ms))
                {
                    writer.Write('V');
                    writer.Write('Z');
                    writer.Write((byte)packagetype);
    
                    lock (lockobj)
                    {
                        PackageIndex = PackageIndex & 0xff;
                        byte index = (byte)PackageIndex;
                        writer.Write(index);
    
                        PackageIndex++;
                    } 
                    //先跳过数据区长度,后面直接写
                    ms.Seek(4, SeekOrigin.Current);
                    writer.Write(databuffer);
                 
                }
            }
    
            //这个数据长度我就直接网buffer写把
            var buffer1 = buffer.AsSpan(4);
            System.Buffers.Binary.BinaryPrimitives.WriteInt32BigEndian(buffer1, datalength);
            return buffer;
    
    
    
        }
    
    }
    
    

    虽然代码很多,但是也没啥核心代码,填充byte[]的手段也很多,我只是随便挑了一个writer,你明白意思就号
    里面其实就只有3个地方需要说明
    1.json不知道编码,一般是utf8,但是谁知道对方怎么想,所以编码你需要询问对方
    2.包索引序号,也没啥可说的,只是注意需要使用原子类操作
    3.数据区长度,按文档就是uint32的大端字节方式,这里我直接用int32理论也无问题,反正文档说了他也不认过大数(我估计他也不认小于0的数)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
  • qllaoda 2022-04-22 16:29
    关注

    这种格式很好处理,长度确定,结构确定,定义结构体啊,把数据填到结构体里,然后把整个结构体一起发送出去就是了。
    因为是和不同架构的处理器通讯,注意一下多字节整形数据的大小端问题。

    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月1日
  • 已采纳回答 4月23日
  • 创建了问题 4月22日

悬赏问题

  • ¥20 unity打光没有照亮物体
  • ¥25 powershell如何拷贝1周前的文件
  • ¥15 询问MYSQL查询SQLSERVER数据表并比较差异后,更新MYSQL的数据表
  • ¥15 关于#前端#的问题,请各位专家解答!
  • ¥15 最小生成树问题 Prim算法和Kruskal算法
  • ¥25 医院住院病人呼叫器设计
  • ¥15 不想和现在的团队合作了,怎么避免他们对程序动手脚
  • ¥20 C语言字符串不区分大小写字典排序相关问题
  • ¥15 关于#python#的问题:我希望通过逆向技术爬取1688搜索页下滑加载的数据
  • ¥15 关于Linux的终端里,模拟实现一个带口令保护的屏保程序遇到的输入输出的问题!(语言-c语言)