Progtwig C para obtener los valores de los campos de encabezado IP de la stack IP de Linux

Estoy desarrollando un progtwig en el que necesito saber los valores de los campos de encabezado IP dentro de mi progtwig. Ya que el encabezado IP es de 20 bytes:

struct ipheader { unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */ unsigned char ip_tos; unsigned short int ip_len; unsigned short int ip_id; unsigned short int ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short int ip_sum; unsigned int ip_src; unsigned int ip_dst; }; 

¿Hay alguna manera de que pueda conocer los valores de estos campos dentro de mi progtwig de C?

Siempre que su comstackdor no introduzca ningún bloque de alineación dentro de esa estructura (asegúrese de que CHAR_BIT sea ​​8 y sizeof(struct ipheader) sea ​​20), debería poder incluirlo en su código tal como está, y luego agregar algo como :

 struct ipheader *iph = (struct ipheader *)blk; printf ("TTL = %d\n", iph->ip_ttl); 

En ese código, tendrá un encabezado IP apuntado por blk , que probablemente sea un char* . Convertirlo al tipo de puntero correcto le permitirá acceder fácilmente a los campos.

El siguiente progtwig completo muestra esto en acción:

 #include  #include  struct ipheader { /* 0 */ unsigned char ip_hl:4, ip_v:4; /* 1 */ unsigned char ip_tos; /* 2 */ unsigned short int ip_len; /* 3 */ unsigned short int ip_id; /* 4 */ unsigned short int ip_off; /* 5 */ unsigned char ip_ttl; /* 6 */ unsigned char ip_p; /* 7 */ unsigned short int ip_sum; /* 8 */ unsigned int ip_src; /* 9 */ unsigned int ip_dst; }; int main (void) { char blk[] = { '\x00','\x11','\x22','\x22','\x33','\x33','\x44','\x44', '\x55','\x66','\x77','\x77','\x88','\x88','\x88','\x88', '\x99','\x99','\x99','\x99' }; struct ipheader *iph = (struct ipheader *)(&blk); printf ("TTL = %x\n", iph->ip_ttl); printf ("sum = %x\n", iph->ip_sum); printf ("dst = %x\n", iph->ip_dst); return 0; } 

La salida es, como se esperaba:

 TTL = 55 sum = 7777 dst = 99999999 

Algunos de esos valores se pueden establecer / recuperar a través de setsockopt()/getsockopt() en el nivel SOL_IP/IPPROTO/IP . Consulte la documentación de su sistema operativo (por ejemplo: en Linux man 7 ip ).

Debe usar las rutinas setsockopt/getsockopt para interactuar con el mecanismo de socket. Estas funciones operan en diferentes niveles ( IPPROTO_IP , IPPROTO_TCP , etc.) y algunas opciones están disponibles solo para tipos de socket particulares (por ejemplo, la opción IP_TTL está disponible solo para sockets AF_INET ).

obtener el valor TTL:

 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); unsigned int opt_val; unsigned int opt_len; getsockopt(sock, IPPROTO_IP, IP_TTL, &opt_val, &opt_len); printf("ttl %d\n", opt_val); 

establecer el valor de TTL:

 int sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); unsigned char ttl_val = 32; setsockopt(sock, IPPROTO_IP, IP_TTL, &ttl_val, sizeof(ttl_val));