Quiero generar un paquete de red para enviar (por ejemplo) el puerto 123 a un servidor NTP para que pueda recibir y analizar el paquete devuelto. El objetivo es comprender mejor cómo los sistemas en red generan, leen y responden los paquetes.Cómo generar paquetes de red con C/C++
(1) ¿Debería usarse una estructura para generar el paquete?
(2) No estoy seguro de cómo rellenar correctamente los diversos campos dentro de la estructura; por ejemplo, ¿deberían establecerse las direcciones IP de origen y de destino con valores hexadecimales? ¿O hay una forma más amigable para los humanos?
(3) Luego, una vez que los campos se han rellenado, ¿se puede enviar la estructura a través de send()/write() a través de una conexión UDP a un servidor NTP? (o TCP, si el protocolo lo exige)
¿Mi enfoque es razonable? He estado leyendo el NTP RFC, pero aún no estoy seguro de lo que mi cliente debería enviar al servidor (como la dirección IP, ¿no debería ser atendido por el encabezado de la capa de red?) He modelado este NTP struct después del ejemplo "transmitir" en el Apéndice A de RFC 5905. Me disculpo si mi pregunta está mal redactada o es demasiado larga. Gracias de antemano por cualquier ayuda. El ejemplo de código siguiente toma prestado del código de ejemplo en el RFC 5905.
typedef unsigned long ipaddr; //32 bits (4 bytes)
typedef signed char s_char; //character type as number, -128..127
typedef unsigned int tdist; //character type as number, 0..255
typedef unsigned long long tstamp; //64 bits (8 bytes)
typedef unsigned long digest; //32 bits (4 bytes)
struct Ntp {
ipaddr dstaddr;
ipaddr srcaddr;
char version;
char leap;
char mode;
char stratum;
char poll;
s_char precision;
tdist rootdelay;
tdist rootdisp;
char refid;
tstamp reftime;
tstamp org;
tstamp rec;
tstamp xmt;
int keyid;
digest dgst;
} Ntp;
int main()
{
struct Ntp packet;
//packet.dstaddr=WHAT_GOES_HERE;
//...
//...
//packet.dgst=WHAT_GOES_HERE;
return 0;
}
¿Estás seguro de que tu estructura 'Ntp' no está acolchada de forma impredecible? –
"en caso de que las direcciones IP de origen y de destino se establezcan con valores hexadecimales", ciertamente no, aunque se preferirían al usar IPv6. C tiene literales decimales, funciones de análisis decimales y funciones de análisis de IP (depende de la plataforma, consulte el manual del sistema operativo). –
Es posible que deba ajustar la capacidad de extremo de cualquier cantidad de bytes múltiples que envíe a través del cable, que es otra razón para evitar enviar toda la estructura en una sola escritura. –