Я хочу отправить необработанные IP-пакеты, которые отлично работают, за исключением одного поля в заголовке IP.Программирование сокета C: Установить идентификатор IP-заголовка в 0?
Мне нужно установить IP-идентификатор 0. Я пробовал следующим образом:
struct iphdr ip;
ip.version = 4; // Ipv4
ip.frag_off = 0; // IP Fragmentation
ip.tos = 0; // Type of Service - We don't need this
ip.ttl = 64; // Maxmimum value
ip.protocol = IPPROTO_UDP; // DHCP uses UDP
ip.check = 0; // The checksum needs to be 0 before being calculated
// We don't yet have an IP Address
if((ip.saddr = inet_addr("0.0.0.0")) == -1) {
perror("Failed to convert IP address");
exit(1);
}
ip.daddr = inet_addr("255.255.255.255"); // we have to do a broadcast
ip.id = 0; //
ip.ihl = 5; // Header length - 5 means no additional options are being sent in the IP header
ip.tot_len = sizeof(struct packet); // The total length of the Packet
Я тогда создать RAW_SOCKET с набором опций IP_HDRINCL:
if ((sockd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)) == -1) {
perror("Failed to create socket");
exit(1);
}
int hdrincl = 1;
if (setsockopt(sockd, IPPROTO_IP, IP_HDRINCL, &hdrincl, sizeof(hdrincl)) == -1) {
perror("Failed to set IP_HDRINCL");
exit(1);
}
Я тогда создать буфер, содержащий мой IP-заголовок, UDP-заголовок и полезную нагрузку и отправьте его.
Однако сетевой стек продолжает менять свой идентификатор в IP-заголовке. Мне нужно включить заголовок IP, но мне также нужно отключить фрагментацию и/или установить IP-идентификатор на 0. Как мне это достичь?
EDIT: Я на Linux
Вы находитесь на linux или windows? Если вы находитесь на окнах, сокеты - это не способ сделать это; попробуйте libpcap. –
Если вы проверите man-страницу 'man 7 raw', вы увидите, что когда' id' является '0', он будет автоматически заполнен, поэтому объясняется, почему вы не можете использовать id 0, однако у меня нет решение для фактического использования id 0. – Jite