2011-06-24 18 views
6

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; 
} 
+2

¿Estás seguro de que tu estructura 'Ntp' no está acolchada de forma impredecible? –

+1

"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). –

+1

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. –

Respuesta

2

No parecen tener una gran cantidad de protocolos de red experiencia de escritura. Declarar una estructura y escribirla no es el camino a seguir. También les señalo http://fixunix.com/ntp/257876-any-samples-ntp-sntp-client-code.html y, específicamente, llamar a los siguientes puntos:

  • ¿Por qué quiere rodar su propia comparación para ejecutar uno de los paquetes existentes?

  • Un problema al escribir un cliente NTP es hacer las cosas bien.

  • El otro no está arruinando el resto de la red o cargando excesivamente los servidores.

En cualquier caso, como se discute en el hilo he señalado que, desea utilizar SNTP y debe echar un vistazo a la implementación de referencia SNTP en el archivo comprimido NTP para señalar el camino y ayudar a determinar qué deberías estar haciendo.

+0

Gracias por la respuesta; Mi objetivo es comprender mejor cómo los sistemas envían, leen y responden los paquetes a través de la red (en el nivel más básico). No estoy tratando de hacer un cliente que se pueda usar públicamente; solo quiero enviar con éxito un paquete que cumpla con un protocolo. En este caso, NTP; Lo elegí porque pensé [quizás erróneamente] que sería un objetivo más realista. Supongo que mi pregunta no anuncia exactamente mi objetivo y me disculpo por cualquier confusión; gracias por su respuesta constructiva. Editaré mi pregunta en consecuencia. – shelladept