当前位置: 首页 > 知识库问答 >
问题:

我怎么可能通过网络发送这个结构?

吕成业
2023-03-14

我得到了下面的结构:

struct fetch_info_t {
    u_int8_t grocery_type;
    u_int8_t arg[1024];
} __attribute__((packed));

我想把这个通过一个套接字发送到服务器,请求数据。我非常希望避免任何库,比如< code>protobuf。< code >杂货类型可以是1到255之间的任何值。一些食品杂货类型,比如类型< code>128,必须提供附加信息。仅仅提供类型< code>128是不够的,我还想提供字符串形式的< code>Cheeses。也就是说,与< code>128不同,type 129必须提供一个数字< code>u_int32_t而不是一个字符串。

基本上,我已经为系统可能需要的附加信息分配了1024字节。问题是,我如何通过套接字发送它,或者更具体地说,如何使用非系统相关的正确信息填充arg?我知道可以使用数字上的htonl,但我如何实际设置缓冲区值?

我可以想象,信息发送实际上最终会将结构指针转换为未签名的 char 数组,并像这样通过套接字发送它。如果有更好的方法,请告诉我。

共有1个答案

高玮
2023-03-14

不能将32位值直接赋给数组,因为不能保证正确对齐。< br> memcpy()将复制没有对齐问题的字节。

u_int32_t the_value=htonl( ... );
struct fetch_info_t the_info;
the_info.grocery_type=129;
memcpy(the_info.arg, &the_value, sizeof(the_value));

然后,由于您的结构已打包,因此您可以将其与

send(my_socket, &the_info,
     sizeof(the_info.grocery_type)+sizeof(the_value), 0);

以防你需要发送字符串

char *the_text= ... ;
size_t the_size=strlen(the_text)+1;
struct fetch_info_t the_info;
the_info.grocery_type=128;
memcpy(the_info.arg, the_text, the_size);
send(my_socket, &the_info,
     sizeof(the_info.grocery_type)+the_size, 0);

请注意,< code>'\0'在这里传输。

 类似资料:
  • 我有这段代码,但我不明白为什么会出现以下错误:

  • 通过网络来发送CAN信息 一旦你能够通过远程漏洞利用来发送CAN信息,那么弄清楚发送哪些信息来影响其物理系统就是小菜一碟了。先前,我们用了整年的时间来弄明白应该向福特和丰田汽车发送哪些信息,所以我们也没有着急也在吉普车上做这样的工作。不过,我们确实也做了少量的一些工作来证明汽车的哪些物理系统是可以通过远程漏洞利用来控制,但是,这并不是我们研究的主要目的。 常规的CAN信息 正如在先前的研究中讨论过

  • 我被困在第2天:hackerrank上的操作员问题。任务如下:给定一顿饭的餐费(一顿饭的基本成本)、小费百分比(餐费的百分比作为小费添加)和税收百分比(餐费的百分比作为税收添加),查找并打印餐费的总成本。将结果四舍五入到最接近的整数。 这是我的代码: 截图

  • 问题内容: 我看过一些代码,例如: 我试过了 但它不起作用。你怎么用? 问题答案: 静态导入可以解决问题: 或者使用以下方法导入每个静态方法和字段 @Steve C的附录:请注意,@ sfussenegger在对我的答案的评论中说了这一点。 “使用System.out的静态导入不仅仅适用于简单的一次性代码。” 因此,请不要以为他(或我)认为此解决方案是良好实践。

  • 问题内容: 有人可以发现我的错误吗,这应该是SQL中的合法查询吗? ON子句中的未知列u.usr_auto_key 这是数据库模式: 这是查询… 问题答案: 尝试切换,并在from子句中:

  • 失败:生成失败,出现异常。 > 其中:Script“C:\flutter\packages\flutter_tools\gradle\flutter.gradle”行:900 错误:任务“:app:CompileFlutterBuildDebug”执行失败。 进程“command”C:\flutter\bin\flutter.bat“已完成,退出值为非零%1 生成在%12s中失败异常:Gradle