gpt4 book ai didi

C++ - 构建带有 header 的数据包并通过 UDP 套接字发送它

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:04:05 24 4
gpt4 key购买 nike

我正在尝试构建一个将通过 UDP 发送的数据包。但是我在接收方没有得到正确的数据。

我想在数据包中包含一个 IP header 、UDP header 和需要发送的数据。在这种情况下,我只想发送“Hello”一词以及随机 header 信息。

char *data = "Hello";
char *packet = (char *)malloc(sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data));
struct iphdr *ip = (struct iphdr*) packet;
struct udphdr *udp = (struct udphdr*) (packet + sizeof(struct iphdr));
char *send_buff = (char *) (packet + sizeof(struct iphdr) + sizeof(struct udphdr));
ip->saddr = inet_addr("1.2.3.4");
ip->daddr = inet_addr("5.6.7.8");
ip->ttl = 5;
udp->source = 5950;
udp->dest = 5950;
udp->len = sizeof(struct udphdr);
udp->check = 0;
strcpy(send_buff, data);

sendto(sock, packet, (sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data)), ROUTER_IP);

我遇到的问题是接收端只是获取随机数据,所以我假设某处的字节数不正确。

在接收方,我让它打印出 IP header 的一个字段作为测试,但它不正确。

char recv_buff[1000];
int recv_bytes = recvfrom(sock, recv_buff, sizeof(recv_buff));
struct iphdr *ip = (struct iphdr*) recv_buff;
cout << static_cast<int16_t>(ip->ttl) << endl;

是我把数据包放在一起错了还是接收端有问题?我用这个例子 http://www.winlab.rutgers.edu/~zhibinwu/html/c_prog.htm作为整理数据包的引用。

最佳答案

您将套接字创建为 socket(AF_INET, SOCK_DGRAM, 0); 意味着它是一个数据报(=UDP,通常)套接字,因此网络堆栈将自动包含 IP header 和 UDP header 等

但是由于您正在尝试创建自己的 IP 和 UDP header ,因此您必须创建一个原始套接字,然后发送数据包(并像您的引用代码那样计算校验和)。

要创建原始套接字,请使用 socket(AF_INET, SOCK_RAW, 0)

关于C++ - 构建带有 header 的数据包并通过 UDP 套接字发送它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13619412/

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