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

标签 c++ c sockets

假设我想使用 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/

相关文章:

c - 如何在 C 中不使用 sleep 创建多个线程

c# - 杀死阻塞的 UDP 套接字

c++ - SDL_KEYDOWN 和键识别不能正常工作

c++ - 关于纯 ECS(实体组件系统)和更新系统的问题

c - getchar() 和 putchar()

java - 为什么我的套接字 getInputStream 返回 null?

java - 创建 Java TCP 协议(protocol)

c++ - 从 C++ 中的外部文件扫描整行

c++ - C++ 中的 MSMQ 示例?

c - 使用编译错误搜索 C 函数定义