gpt4 book ai didi

C套接字使用二进制协议(protocol)发送多字段消息

转载 作者:行者123 更新时间:2023-12-04 05:14:09 25 4
gpt4 key购买 nike

如何构造具有给定消息规范的请求消息,然后发送到服务器思想 c 套接字?二进制协议(protocol)用于客户端和服务器通信。以下方法是否正确?

给定消息规范:

字段格式长度值
------------ ------ ------ --------
请求 ID Uint16 2 20
requestNum Uint16 2 100
requestTitle String 10 数据串


/****************** 方法一 ****************/
typedef 无符号短 uint16;
类型定义结构{
uint16 请求 ID [2];
uint16 requestNum [2];
无符号字符请求标题[10];
}requestMsg;

请求消息 rqMsg;

memcpy(rqMsg.requesID, "\x0\x14", 2);//20
memcpy(rqMsg.requesNum, "\x0\x64", 2);//100
memcpy(rqMsg.requesTitle, "title01", 10);

发送(sockfd, &rqMsg, sizeof(rqMsg), 0);

/******************方法2 ****************/
无符号字符 rqMsg[14];
memset(rqMsg, 0, 14);
memcpy(rqMsg, "\x0\x14", 2);
memcpy(rqMsg+2, "\x0\x64", 2);
memcpy(rqMsg+4, "title01", 10);

发送( socks ,&rqMsg,sizeof(rqMsg),0);

最佳答案

恐怕你误解了一些东西:长度列似乎告诉你以字节为单位的长度,所以如果你收到一个 uint16 你会收到 2 个字节。

您的第一种方法可能会通过 data structure alignment 导致严重问题.如果我在你的鞋子里,我更喜欢第二种方法,并将我自己的字节填充到一个字节数组中。

关于在此处填充字段的一般说明:我将 memcpy 用于 uint16 等“ native ”字段是没有用的。它可能有效,但只是浪费运行时间。您可以填写结构的字段,只需为其分配一个值,如 rqMsg.requesID = 20;
另一个问题是字节顺序或endianness 的问题。你的二进制协议(protocol)。

作为一个完整的包,我将实现一个“serializeRequest”函数,获取结构的字段并根据协议(protocol)将其转换为字节数组。

关于C套接字使用二进制协议(protocol)发送多字段消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14498135/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com