假设我想使用 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);
...
同样,您不必使用我定义的 header
和 data
结构。只需使用您的程序需要的任何东西。关键是您有一个转换函数,可以将所有数据以明确定义的偏移量、以明确定义的字节顺序写入缓冲区,然后将该缓冲区传递给 send() 函数。
在网络连接的另一端,您需要一个程序来解释它接收到的数据。在这方面,您需要编写相应的函数(ntohHeader
等)。这些函数将 memcpy
位从缓冲区中取出并放入局部变量,它可以将其传递给 ntohs
或 ntohl
。我会把这些函数留给你写。
关于c++ - 在 C/C++ 中创建和发送数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795283/