c - 在 C 中构建具有固定大小 header 的 UDP 数据报

标签 c sockets header datagram fixed-size-types

我是 C 语言新手,我正在尝试构建一个 UDP 数据报,然后将其从客户端程序发送到另一台计算机上的服务器程序。

我在尝试构建数据报时遇到了一些问题,特别是固定大小(IPv4) header : header 的格式为(客户端IP(32位)|客户端端口(16位)|数据包长度(32位)|...等)

我选择采用的方法是收集必要的 header 和正文信息,然后将它们转换为 char*,然后将它们连接在一起以生成数据报。但是,当我将 intlong 转换为 char* (端口号和数据包长度)时,它不能保证固定大小的 char * (例如,如果计算出数据包长度(数据类型 long)为 440,我将其转换为 char*,则 strlen 将显示 char* 的长度 是 2 而不是 4,因为这个数字不够大,无法占用全部 4 个字节,我认为...)

我尝试了一种通过按位操作将 long 转换为固定大小 char* 的不同方法:

//assume the datagram size was calculated to be 440 bits
unsigned long len = 440;
unsigned char dg_len [4];
dg_len[0] = (len >> 24) & 0xFF;
dg_len[1] = (len >> 16) & 0xFF;
dg_len[2] = (len >> 8) & 0xFF;
dg_len[3] = len & 0xFF;
printf("%d" ,strlen(dg_lenPtr)); //this would display 0 
printf("%d" ,(unsigned long)dg_lenPtr); //this display some random number

我对此想到的唯一解释是,由于 strlen 显示长度为 0,因此 dg_lenPtr 未使用的 2 个高字节被读取为空字符。

我开始认为 char* 不是我需要用来构建数据报的数据结构。有人可以指出我需要做什么来为数据报构建固定大小的 header 的正确方向吗?

最佳答案

您不负责生成 IPv4 header 。 send()sendto() 函数会为您处理该问题。您所要做的就是将所需的数据报有效负载发送到所需的目标 IP:Port(通过将其直接指定到 sendto()connect()send() 的情况)。

int connect(int socket, const struct sockaddr *address, socklen_t address_len);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

关于c - 在 C 中构建具有固定大小 header 的 UDP 数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584697/

相关文章:

copy_from_user函数打印垃圾值

image - 在博客上添加 svg 图片作为标题

c++ - 包含 jsonCpp header 的问题

c++ - 线程 : How to calculate precisely the execution time of an algorithm (duration of function) in C or C++?

c - 错误: unknown type name ‘WebKitWebFrame’

c - 在 GtkScrolledWindow 中自动调整 GtkTextView 的大小

multithreading - 如何将 TWSocket 的 OnDataAvailable() 事件推送到 Delphi 6 应用程序中的后台线程?

c - errno、strerror 和 Linux 系统调用

sockets - ipvsadm 在 kubeadm 集群中未显示任何条目

javascript - 用于验证 http header 值的正则表达式