gpt4 book ai didi

c++ - 在 C/C++ 中创建和发送数据包

转载 作者:IT老高 更新时间:2023-10-28 22:25:42 25 4
gpt4 key购买 nike

假设我想使用 C 或 C++ 将以下数据发送到套接字,全部在一个数据包中:

Headers
-------
Field 1: 2 byte hex
Field 2: 2 byte hex
Field 3: 4 byte hex

Data
----
Field1 : 2 byte hex
Field1 : 8 byte hex

创建和发送包含所有这些数据的数据包的代码通常是什么样的?

最佳答案

假设您的程序已经组织好,在一个 struct 中包含 header ,在另一个 struct 中包含数据。例如,您可能有以下数据结构:

#include <stdint.h>
struct header {
uint16_t f1;
uint16_t f2;
uint32_t f3;
};
struct data {
uint16_t pf1;
uint64_t pf2;
};

我们称这个组织为“主机格式”。对我来说,主机格式是什么并不重要,只要它对您的程序的其余部分有用。我们将传递给 send() 的格式称为“网络格式”。 (我选择这些名称以匹配 htons(主机到网络短)和 htonl(主机到网络长)名称。)

这里有一些我们可能会觉得很方便的转换函数。其中每一个都将您的主机格式结构转换为网络格式缓冲区。

#include <arpa/inet.h>
#include <string.h>
void htonHeader(struct header h, char buffer[8]) {
uint16_t u16;
uint32_t u32;
u16 = htons(h.f1);
memcpy(buffer+0, &u16, 2);
u16 = htons(h.f2);
memcpy(buffer+2, &u16, 2);
u32 = htonl(h.f3);
memcpy(buffer+4, &u32, 4);
}
void htonData(struct data d, char buffer[10]) {
uint16_t u16;
uint32_t u32;
u16 = htons(d.pf1);
memcpy(buffer+0, &u16, 2);
u32 = htonl(d.pf2>>32);
memcpy(buffer+2, &u32, 4);
u32 = htonl(d.pf2);
memcpy(buffer+6, u32, 4);
}
void htonHeaderData(struct header h, struct data d, char buffer[18]) {
htonHeader(h, buffer+0);
htonData(d, buffer+8);
}

要发送您的数据,请执行以下操作:

...
char buffer[18];
htonHeaderData(myPacketHeader, myPacketData, buffer);
send(sockfd, buffer, 18, 0);
...

同样,您不必使用我定义的 headerdata 结构。只需使用您的程序需要的任何东西。关键是您有一个转换函数,可以将所有数据以明确定义的偏移量、以明确定义的字节顺序写入缓冲区,然后将该缓冲区传递给 send() 函数。

在网络连接的另一端,您需要一个程序来解释它接收到的数据。在这方面,您需要编写相应的函数(ntohHeader 等)。这些函数将 memcpy 位从缓冲区中取出并放入局部变量,它可以将其传递给 ntohsntohl。我会把这些函数留给你写。

关于c++ - 在 C/C++ 中创建和发送数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795283/

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