C++ C++;-构造具有标头的数据包并通过UDP套接字发送

C++ C++;-构造具有标头的数据包并通过UDP套接字发送,c++,c,sockets,networking,C++,C,Sockets,Networking,我正在尝试构建一个将通过UDP发送的数据包。但是,我在接收端没有得到正确的数据 在数据包中,我想包括IP报头、UDP报头和需要发送的数据。在本例中,我只想发送单词“Hello”以及随机标题信息 char *data = "Hello"; char *packet = (char *)malloc(sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(data)); struct iphdr *ip = (struct iphdr*) pack

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

在数据包中,我想包括IP报头、UDP报头和需要发送的数据。在本例中,我只想发送单词“Hello”以及随机标题信息

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报头的一个字段作为测试,但它不正确

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;
charrecv_buff[1000];
int recv_bytes=recvfrom(sock,recv_buff,sizeof(recv_buff));
结构iphdr*ip=(结构iphdr*)recv_buff;

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

但是,由于您试图创建自己的IP和UDP报头,因此必须创建一个原始套接字,然后发送数据包(并像参考代码那样计算校验和)


要创建原始套接字,请使用
socket(AF\u INET,SOCK\u raw,0)

除了不使用原始套接字的问题之外,您还没有正确设置端口号等。必须按网络字节顺序排列,因此您应该使用例如
htons
。还有其他字段应按网络字节顺序排列。

如果您在堆栈顶部使用自己的ip和udp头,我希望您在删除您和堆栈的头之后解析数据。如果接收套接字是原始的,您也将获得堆栈的ip和udp头。

您可以显示创建套接字的代码,以便我可以知道您使用的是哪种类型的套接字吗?int sock=socket(AF_INET,sock_DGRAM,0);很抱歉没有说得更清楚,我希望在UDP套接字自动添加的任何内容之上添加一个额外的IP和UDP头。