Я пытаюсь отправить сообщение, используя заголовок IP. Это мой IP-заголовок
struct iphdr constructIpHeader(struct in_addr dst, char if_name[], int sockfd, int bufSzie){
printf("constructing IP header...\n");
struct iphdr ip_hdr;
ip_hdr.ihl = 5;
ip_hdr.version = 4;
ip_hdr.tos = 0;
ip_hdr.tot_len = htons(IPHDRSIZ + bufSzie);
ip_hdr.id = htons(0x0400);
ip_hdr.frag_off = htons(0x000);
ip_hdr.ttl = 0x40;
ip_hdr.protocol = 6;
ip_hdr.check = 0;
ip_hdr.saddr = get_ip_saddr(if_name, sockfd); // source ip
ip_hdr.daddr = dst.s_addr;
ip_hdr.check = ip_checksum(&ip_hdr, IPHDRSIZ); // checksum good
printf("IP header complete\n");
return ip_hdr;
}
Так я создаю и отправляю данные
memset(&sk_addr,0,sk_addr_size);
struct iphdr ip_hdr;
ip_hdr = constructIpHeader(dst_ip, interfaceName, sockfd, strlen(buf));
char ip_payload[IPHDRSIZ+strlen(buf)+1];
char *ip = (char *)&ip_hdr;
memcpy(ip_payload, ip, IPHDRSIZ);
memcpy(&ip_payload[IPHDRSIZ], buf, strlen(buf));
send_message(interfaceName, sk_addr, dst_mac, ip_payload, sockfd, 1, if_hwadd
Так выглядит мой Wireshark
Это все действительно ново для меня, поэтому любой совет будет полезен. Я копался в форумах и думаю, что правильно строю заголовок, поэтому я не понимаю, почему пакет искажен. Я думал, что это может быть связано с memcpys, прежде чем я отправлю сообщение, но я не уверен в другом способе подойти к этому.