View
216
Download
0
Category
Preview:
Citation preview
11
SOCKETSSOCKETSAIRAN GODOY HERNANDEZAIRAN GODOY HERNANDEZ
JOSE MARIA RODRIGUEZ RODRIGUEZJOSE MARIA RODRIGUEZ RODRIGUEZ
5º INGENIERIA EN INFORMATICA5º INGENIERIA EN INFORMATICA
AMPLIACION DE SISTEMAS AMPLIACION DE SISTEMAS OPERATIVOSOPERATIVOS
22
Definición de SocketDefinición de Socket
Punto de comunicación entre Punto de comunicación entre procesos, mediante el cual procesos, mediante el cual pueden emitir o recibir pueden emitir o recibir información.información.
Uso de Descriptores.Uso de Descriptores.
33
Características de un socketCaracterísticas de un socket
A cada socket le corresponde una A cada socket le corresponde una constante simbólica definida en constante simbólica definida en <sys/socket.h><sys/socket.h>
Dominio: Conjunto de sockets con los : Conjunto de sockets con los cuales se podrá establecer cuales se podrá establecer comunicación. comunicación.
Tipo: Define las propiedades de las : Define las propiedades de las comunicaciones en las cuales está comunicaciones en las cuales está implicado.implicado.
44
Dominio de socketDominio de socket
Dominio Unix: estos sockets se destinan a una estos sockets se destinan a una comunicación local: les corresponden direcciones comunicación local: les corresponden direcciones locales que son referencias a Unix idénticas a las de locales que son referencias a Unix idénticas a las de los archivos.los archivos.
• ls, rmls, rm
Dominio Internet: la conexión a una dirección la conexión a una dirección Internet de este tipo de socket necesita la Internet de este tipo de socket necesita la preparación de un objeto que tenga la estructura preparación de un objeto que tenga la estructura sockaddr_insockaddr_in. Para ello:. Para ello:• Conocimiento de la dirección de la máquina localConocimiento de la dirección de la máquina local: :
gethostname, gethostbyname, INADDR_ANYgethostname, gethostbyname, INADDR_ANY• Elección de un número de puertoElección de un número de puerto: getservbyname, getservbyname,
IPPORT_RESERVEDIPPORT_RESERVED
55
Dominio de un socket Dominio de un socket
Formato de direcciones y protocolos Formato de direcciones y protocolos
Dominio UNIXDominio UNIX (AF_UNIX) (AF_UNIX) : : Los Los sockets son locales donde se definen.sockets son locales donde se definen.
struct sockaddr_un {struct sockaddr_un {short sun_family; short sun_family; /* dominio UNIX *//* dominio UNIX */
charcharsun_data[108]; sun_data[108]; /* referencia de /* referencia de dirección */dirección */
};};
66
Dominio de un socketDominio de un socket
Dominio InternetDominio Internet (AF_INET) (AF_INET) : : Asigna un servicio a una Asigna un servicio a una máquina determinada.máquina determinada.
struct in_addr{struct in_addr{u_long s_addr;u_long s_addr;
};};
struct sockaddr_in{struct sockaddr_in{short sin_family; short sin_family; /* familia de dirección: /* familia de dirección:
AF_INET */AF_INET */ u_short sin_port; u_short sin_port; /* número de puerto *//* número de puerto */
struct in_addr sin_addr;struct in_addr sin_addr; /* dirección Internet *//* dirección Internet */
char sin_zero[8]; char sin_zero[8]; /* campo de 8 ceros *//* campo de 8 ceros */};};
77
Tipo de un socketTipo de un socket
Propiedades de comunicaciónPropiedades de comunicación
1.1. Fiabilidad de la transmisión. Fiabilidad de la transmisión.
2.2. Conservación del orden de los datos. Conservación del orden de los datos.
3.3. No duplicación de datos. No duplicación de datos.
4.4. Comunicación en modo conectado. Comunicación en modo conectado.
5.5. Conservación de los límites de los Conservación de los límites de los mensajes. mensajes.
6.6. Envío de mensajes <<urgentes>>. Envío de mensajes <<urgentes>>.
88
Tipo de un socketTipo de un socket
Tipos disponiblesTipos disponibles(características, propiedades, protocolo)(características, propiedades, protocolo)
• SOCK_DGRAM: Destinados a la comunicación en : Destinados a la comunicación en modo no conectado para envío de datagramas de modo no conectado para envío de datagramas de tamaño limitado. Propiedad 5. UDP.tamaño limitado. Propiedad 5. UDP.
• SOCK_STREAM: Comunicaciones fiables en modo : Comunicaciones fiables en modo conectado. Propiedades 1-4. Propiedad 6. TCP.conectado. Propiedades 1-4. Propiedad 6. TCP.
• SOCK_RAW:: Acceso a los protocolos de más bajo Acceso a los protocolos de más bajo nivel. Superusuario. IP.nivel. Superusuario. IP.
99
FUNCIONES BASICASFUNCIONES BASICAS
SOCKETSOCKET BINDBIND CONNECTCONNECT CLOSECLOSE LISTENLISTEN ACCEPTACCEPT WRITEWRITE SENDSEND
READREAD RECVRECV SENDTOSENDTO RECVFROMRECVFROM SHUTDOWNSHUTDOWN GETSOCKNAMEGETSOCKNAME GETPEERNAMEGETPEERNAME
1010
FUNCIONEFUNCIONESS
int socketint socket (dominio,tipo,protocolo) (dominio,tipo,protocolo)
– Crea un socket para comunicaciones.– Devuelve un descriptor ó -1.– Cuando se crea un proceso hijo hereda este descriptor.– Dominio :
PF_UNIX, PF_LOCAL, PF_INET, PF_INET6, PF_IPX, PF_NETLINK, PF_X25, PF_AX25, PF_ATMPVC, PF_APPLETALK, PF_PACKET
-Tipo :
SOCK_STREAM, SOCK_DGRAM, SOCK_RAW, SOCK_SEQPACKET, SOCK_RDM
1111
FUNCIONESFUNCIONES
int int bindbind ( (socketsocket,,localaddrlocaladdr,,addrlenaddrlen))
int int connectconnect ( (socketsocket,, addr addr,,addrlenaddrlen))
– Especifica una dirección local y un número de puerto del protocolo– Asigna un nombre (dirección + puerto) al socket.
– Orientado a conexión-> Establece una conexión con el otro socket– No orientado a conexión-> addr es la dirección por defecto a la cual se envían los datagramas.
1212
FUNCIONESFUNCIONES
int int closeclose ( (socketsocket))
int int listenlisten ( (socketsocket,, qlen qlen))
– Si n procesos usan el socket decrementa las referencias y lo libera cuando n=0.– Cierra la conexión y libera el socket.
– Establece una conexión pasiva ( Espera peticiones de entrada)– qlen= Longitud de la cola para socket establecidos completamente– Solo se aplica a los socket
SOCK_STREAM, SOCK_SEQPACKET Y SOCK_RDM
1313
FUNCIONEFUNCIONESS
int int accepacceptt (dominio, (dominio,addraddr,,lenlen))
– Retira una petición de la cola de peticiones pendientes (definida en listen)– Si no hay pendientes y el socket es con bloqueo queda esperando– Llena la estructura apuntada por addr con la dirección y puerto remoto.
1414
FUNCIONESFUNCIONES
int write (socket, buf, len)- Envía datos a traves de la conexión TCP.
int send (socket, mensaje, lon, flags)- Envia un mensaje- Solo cuando el socket este en estado connected- Flags especifica si el mensaje es fuera de banda
1515
FUNCIONESFUNCIONES
int read (socket, buf, len)- Lee datos de una conexión TCP.
int recv (socket, mensaje, lon, flags)- Recibe un datagrama- Solo cuando el socket este en estado connected
1616
FUNCIONESFUNCIONES
int sendto (int socket, const void *mensaje, int lon, unsigned int flags, const struct sockaddr *to, int
tolen)
- Envía un mensaje.
int recvfrom (int socket, const void *mensaje, int lon,
unsigned int flags, const struct sockaddr *from, int fromlen)
-Recibe datos de un socket.
1717
FUNCIONESFUNCIONES
inet_aton, inet_ntoa
– Convierte entre una string que especifica la dirección IP expresada en decimal separada por “.” en su valor binario en formato de red y viceversa.
inet_pton, inet_ntop
– Convierte entre una string que especifica la dirección IP expresada en decimal separada por “.” en una estructura de direccion de red y viceversa.
htons
- Convierte enteros binarios del orden nativo del equipo al orden estándar de red y viceversa.
1818
FUNCIONEFUNCIONESS
int int shutdownshutdown ( (socket, direccionsocket, direccion))
Getsockname, getpeernameGetsockname, getpeername
– Cierra la conexión en una sola dirección• 0 Entrada• 1 Salida• 2 Ambas
– Obtiene la dirección y puerto de los extremos
1919
EJEMPLOEJEMPLO
CLIENTE DNSCLIENTE DNS
2020
INTRODUCCIONINTRODUCCION
El cliente DNS se encarga de enviar un El cliente DNS se encarga de enviar un paquete al puerto 53 mediante UDP con paquete al puerto 53 mediante UDP con una pregunta, y el servidor responde con una pregunta, y el servidor responde con otro paquete con la respuesta.otro paquete con la respuesta.
En la pregunta el usuario especifica el tipo En la pregunta el usuario especifica el tipo de interrogación que desea (A, NS, SOA ...)de interrogación que desea (A, NS, SOA ...)
Para utilizar el programa se usa la ste. Para utilizar el programa se usa la ste. Sintaxis : Sintaxis :
./cliente DirIPServidor NombreDominio./cliente DirIPServidor NombreDominio
2121
INTRODUCCIONINTRODUCCION
Formato de los mensajesFormato de los mensajes
CABECERACABECERA
PREGUNTAPREGUNTA
RESPUESTARESPUESTA
AUTORIDADAUTORIDAD
ADICIONALADICIONAL
RRsRRs
RRsRRs
RRsRRs
2222
INTRODUCCIONINTRODUCCIONFormato de la cabeceraFormato de la cabecera
IdentificadorIdentificador
QR QR Cód. IntCód. Int AAAA TCTC RDRD RARA ZZ Cód. RespCód. Resp
QD Count QD Count
AN CountAN Count
NS CountNS Count
AR CountAR Count
QRQR : Pregunta (0) Respuesta (1) : Pregunta (0) Respuesta (1) Cód. RespCód. Resp : No error (0) Errores(1-5) : No error (0) Errores(1-5)
Cód. IntCód. Int : Pregunta(0) Preg. Inversa (1) Status (2) : Pregunta(0) Preg. Inversa (1) Status (2) QDCountQDCount : Nº de preguntas : Nº de preguntas
AAAA : Respuesta con autorización : Respuesta con autorización ANCountANCount : Nº de RRs de respuestas : Nº de RRs de respuestas
TCTC : Truncado : Truncado NSCountNSCount : Nº de RRs de autoridad : Nº de RRs de autoridad
RDRD : Solicita recursividad : Solicita recursividad ARCountARCount : Nº de RRs de Adicional : Nº de RRs de Adicional
RARA : Recursividad disponible : Recursividad disponible
ZZ : Reservado : Reservado
2323
INTRODUCCIONINTRODUCCION
Formato de la preguntaFormato de la pregunta
QNAMEQNAME
..
..
QTYPEQTYPE
QCLASSQCLASS
QNAME : Puede ser una secuencia de etiquetas acabadas en un QNAME : Puede ser una secuencia de etiquetas acabadas en un 0, 0, acabadas en un puntero o puede ser un puntero. acabadas en un puntero o puede ser un puntero.
QTYPE : Tipo de interrogación (1 A – 2 NS – 5 NS - 6 SOA – 11 QTYPE : Tipo de interrogación (1 A – 2 NS – 5 NS - 6 SOA – 11 WKS – WKS – 12 PTR – 13 HINFO – 15 MX – 16 TXT) 12 PTR – 13 HINFO – 15 MX – 16 TXT)
QCLASS : Clase de interrogación ( 1 IN – 2 CS - 3 CH – 4 CH)QCLASS : Clase de interrogación ( 1 IN – 2 CS - 3 CH – 4 CH)
2424
INTRODUCCIONINTRODUCCION
NOMBRENOMBRE..
..
TIPOTIPO
CLASECLASE
TTL (32)TTL (32)
LONGITUD DATOSLONGITUD DATOS
DATOS DESCRIPTIVOSDATOS DESCRIPTIVOS
Formato del Registro de RecursoFormato del Registro de Recurso
COMPRESION : Reemplazar un nombre de dominio completo o la parte COMPRESION : Reemplazar un nombre de dominio completo o la parte
final de un nombre de dominio por un puntero a una final de un nombre de dominio por un puntero a una
ocurrencia anterior.ocurrencia anterior.
11 11 OFFSETOFFSET
2525
INTRODUCCIONINTRODUCCION
CNAMECNAME
CPUCPU
OSOS
PREFERENCEPREFERENCE
EXCHAGEEXCHAGE
Formato de los DatosFormato de los Datos
NSDNAMENSDNAME
PTRDNAMEPTRDNAME MNAMEMNAME
RNAMERNAME
SERIALSERIAL
REFRESHREFRESH
RETRYRETRY
EXPIREEXPIRE
MINIMUMMINIMUM
ADDRESSADDRESS
TXTDATATXTDATA
ADDRESSADDRESS
PROTOCOLPROTOCOL BITMAPBITMAP
BITMAPBITMAP
PTRPTR
CNAMECNAME
MXMX
AA
HINFOHINFO
NSNS
TXTTXT
SOASOA
WKSWKS
2626
PETICION/RESPUESTAPETICION/RESPUESTA
QD Count = 1QD Count = 1
AR CountAR Count
NS CountNS Count
AN CountAN Count
Cód. RespCód. RespZZRARARD= 1RD= 1TC =0TC =0AAAAC. Int = 0C. Int = 0QR = 0QR = 0
Id = 45Id = 45
CLASS = INCLASS = IN
TYPE = SOATYPE = SOA
QNAME = www.playboy.comQNAME = www.playboy.com
CABECERA
PREGUNTA
Ejemplo : Queremos saber quien es el administrador de la página de Ejemplo : Queremos saber quien es el administrador de la página de playboyplayboy
2727
PETICION/RESPUESTAPETICION/RESPUESTAEjemplo : Queremos saber quien es el administrador de la página de Ejemplo : Queremos saber quien es el administrador de la página de
playboyplayboy
2828
PETICION/RESPUESTAPETICION/RESPUESTA
QD Count = 1QD Count = 1
AR Count = 0AR Count = 0
NS Count = 1NS Count = 1
AN Count = 1AN Count = 1
C. Resp = 0C. Resp = 0ZZRA=1RA=1RD = 1RD = 1TC = 0TC = 0AA=0AA=0C. Int =0C. Int =0QR =1QR =1
Id = 45Id = 45
CLASS = INCLASS = IN
TYPE = SOATYPE = SOA
QNAME = www.playboy.comQNAME = www.playboy.com
TTL = 85657TTL = 85657
CLASE = INCLASE = IN
LONG. DATOS LONG. DATOS
DATOS = www.phat.playboy.com.DATOS = www.phat.playboy.com.
TIPO = CNAMETIPO = CNAME
NOMBRE = www.playboy.comNOMBRE = www.playboy.com
Phat playboy.com. Type = SOA clase = IN ttl= 30 3dchi.playboy.com Phat playboy.com. Type = SOA clase = IN ttl= 30 3dchi.playboy.com
Tim.playboy.comTim.playboy.com Serial = 2541534555 Refresh = 3600 Retry = 900 Serial = 2541534555 Refresh = 3600 Retry = 900 Expire = 3600000 Minimum = 30Expire = 3600000 Minimum = 30
CABECERA
PREGUNTA
RESPUESTA
AUTORIDAD
ADICIONAL
Ejemplo : Queremos saber quien es el administrador de la página de Ejemplo : Queremos saber quien es el administrador de la página de playboyplayboy
2929
EJEMPLOSEJEMPLOS
3030
EJEMPLOSEJEMPLOS
3131
ESTRUCTURASESTRUCTURAStypedef struct {typedef struct {
unsigned id :16; unsigned id :16; // IDENTIFICADOR// IDENTIFICADOR
unsigned rd :1; unsigned rd :1; // FLAG DE RECURSIVIDAD // FLAG DE RECURSIVIDAD unsigned tc :1; unsigned tc :1; // FLAG DE TRUNCAMIENTO// FLAG DE TRUNCAMIENTOunsigned aa :1; unsigned aa :1; // RESPUESTA AUTORITATIVA // RESPUESTA AUTORITATIVA unsigned opcode :4; unsigned opcode :4; // TIPO DE CONSULTA // TIPO DE CONSULTA unsigned qr :1; unsigned qr :1; // FLAG DE PREGUNTA O RESPUESTA// FLAG DE PREGUNTA O RESPUESTA
unsigned rcode :4; unsigned rcode :4; // CODIGO DE RESPUESTA // CODIGO DE RESPUESTA unsigned z :3; unsigned z :3; // NO USADO // NO USADO unsigned ra :1; unsigned ra :1; // RECURSION DISPONIBLE // RECURSION DISPONIBLE
unsigned qdcount :16; unsigned qdcount :16; // NUMERO DE PREGUNTAS // NUMERO DE PREGUNTAS unsigned ancount :16; unsigned ancount :16; // NUMERO DE RRs de RESPUESTA // NUMERO DE RRs de RESPUESTA unsigned nscount :16; unsigned nscount :16; // NUMERO DE RRs de AUTORIDAD // NUMERO DE RRs de AUTORIDAD unsigned arcount :16; unsigned arcount :16; // NUMERO DE RRs ADICIONALES // NUMERO DE RRs ADICIONALES
} HEADER;} HEADER;
3232
ESTRUCTURASESTRUCTURAStypedef struct {typedef struct {
unsigned qtype :16; unsigned qtype :16; // TIPO DE PREGUNTA // TIPO DE PREGUNTA unsigned qclass :16; unsigned qclass :16; // CLASE DE PREGUNTA // CLASE DE PREGUNTA
} PREGUNTA;} PREGUNTA;
typedef struct { typedef struct {
unsigned type :16;unsigned type :16; // TIPO DE RECURSO// TIPO DE RECURSOunsigned class :16;unsigned class :16; // CLASE DE RECURSO// CLASE DE RECURSOunsigned ttl1 :16;unsigned ttl1 :16; // TIEMPO DE VIDA// TIEMPO DE VIDAunsigned ttl2:16;unsigned ttl2:16;unsigned rdlength :16;unsigned rdlength :16; // LONGITUD DE LOS DATOS// LONGITUD DE LOS DATOS
} RECURSO;} RECURSO;
typedef struct {typedef struct { // ESTRUCTURA PARA OBTENER UNA DIRECCION IP// ESTRUCTURA PARA OBTENER UNA DIRECCION IP
unsigned a:8;unsigned a:8; // PRIMER DIGITO// PRIMER DIGITOunsigned b:8;unsigned b:8; // SEGUNDO DIGITO// SEGUNDO DIGITOunsigned c:8;unsigned c:8; // TERCER DIGITO// TERCER DIGITOunsigned d:8;unsigned d:8; // CUARTO DIGITO// CUARTO DIGITO
} AR;} AR;
3333
ESTRUCTURASESTRUCTURAStypedef struct {typedef struct {
unsigned serial1:16;unsigned serial1:16; // SERIAL// SERIAL unsigned serial2:16;unsigned serial2:16;
unsigned refresh1:16;unsigned refresh1:16; // TIEMPO DE REFRESCO// TIEMPO DE REFRESCO unsigned refresh2:16;unsigned refresh2:16;
unsigned retry1:16;unsigned retry1:16; // TIEMPO DE REINTENTO// TIEMPO DE REINTENTO unsigned retry2:16;unsigned retry2:16;
unsigned expire1:16;unsigned expire1:16; // TIEMPO DE EXPIRACION// TIEMPO DE EXPIRACION unsigned expire2:16;unsigned expire2:16;
unsigned minimum1:16;unsigned minimum1:16; // VALOR PREDETERMINADO PARA TTL// VALOR PREDETERMINADO PARA TTL unsigned minimum2:16; unsigned minimum2:16;
} SOAREG;} SOAREG;
char *Tipo[17] = {"","A","NS","3","4","CNAME","SOA","7","8","9","10","WKS",char *Tipo[17] = {"","A","NS","3","4","CNAME","SOA","7","8","9","10","WKS", "PTR","HINFO","","MX","TXT"};"PTR","HINFO","","MX","TXT"};
char *Clase[5] = {"","IN","CS","CH","HS"};char *Clase[5] = {"","IN","CS","CH","HS"};
3434
FUNCIONESFUNCIONES
int CodificaNombre(char *buf, char *qname, int qnamelen)int CodificaNombre(char *buf, char *qname, int qnamelen)
Recibe un puntero a la zona del paquete donde irá el nombre Recibe un puntero a la zona del paquete donde irá el nombre codificado (buf), el nombre a codificar (qname) y la longitud de dicho codificado (buf), el nombre a codificar (qname) y la longitud de dicho nombre (qnamelen). nombre (qnamelen).
Empieza en el ultimo punto sustituyéndolo por un 0 (marca de fin de Empieza en el ultimo punto sustituyéndolo por un 0 (marca de fin de nombre) y cada vez que encuentra otro lo sustituye por un valor nombre) y cada vez que encuentra otro lo sustituye por un valor numérico que coincide con el número de caracteres hasta el siguiente numérico que coincide con el número de caracteres hasta el siguiente punto.punto.
Ejemplo : www.dis.ulpgc.es. se transformaría en Ejemplo : www.dis.ulpgc.es. se transformaría en 3www3dis5ulpgc2es03www3dis5ulpgc2es0
void Imprime (u_char **posmem, u_char *buf)void Imprime (u_char **posmem, u_char *buf)
Recibe una posición de memoria (posmem) y la posición de inicio del Recibe una posición de memoria (posmem) y la posición de inicio del paquete (buf).paquete (buf).
Se encarga de imprimir un nombre de dominio por pantalla teniendo Se encarga de imprimir un nombre de dominio por pantalla teniendo en cuenta que puede ser un conjunto de etiquetas acabado en 0, un en cuenta que puede ser un conjunto de etiquetas acabado en 0, un conjunto de etiquetas acabados en un puntero o un puntero.conjunto de etiquetas acabados en un puntero o un puntero.
Cuando se acaba de imprimir, posmem apunta ahora a la siguiente Cuando se acaba de imprimir, posmem apunta ahora a la siguiente dirección después del nombre.dirección después del nombre.
3535
FUNCIONESFUNCIONES
void MuestraRR(u_char **pointer,u_char *buf,int cont)void MuestraRR(u_char **pointer,u_char *buf,int cont)
Recibe la posición de memoria del RR (pointer), el inicio del Recibe la posición de memoria del RR (pointer), el inicio del paquete (buf) y el numero de RR (cont).paquete (buf) y el numero de RR (cont).
Imprime por pantalla los registros de recursos (tantos como diga Imprime por pantalla los registros de recursos (tantos como diga la variable cont) a partir de pointer :la variable cont) a partir de pointer :
1.1. Imprime el nombre de dominio.Imprime el nombre de dominio.
2.2. La estructura RECURSO (clase, tipo, ttl y long. datos).La estructura RECURSO (clase, tipo, ttl y long. datos).
3.3. Para mostrar el contenido de los datos se tiene en cuenta el Para mostrar el contenido de los datos se tiene en cuenta el tipo interrogación (A, NS, SOA). tipo interrogación (A, NS, SOA).
Ej : si es A se imprime una Ej : si es A se imprime una dirección IP (estructura AR).dirección IP (estructura AR).
si es SOA se muestra el nombre del servidor, la si es SOA se muestra el nombre del servidor, la dirección dirección de correo y luego la estructura de correo y luego la estructura SOAREG.SOAREG.
Se hace uso de la función “Imprime”.Se hace uso de la función “Imprime”. Cuando se acaba de imprimir pointer apunta ahora al siguiente Cuando se acaba de imprimir pointer apunta ahora al siguiente
registro de recurso (Autoridad ó Adicional).registro de recurso (Autoridad ó Adicional).
3636
FUNCIONESFUNCIONES
Int ConstruyePaquete(char *buf, char *qname, int qnamelen)Int ConstruyePaquete(char *buf, char *qname, int qnamelen)
Recibe un puntero al inicio del paquete (buf), el nombre del dominio Recibe un puntero al inicio del paquete (buf), el nombre del dominio (qname) y la longitud de dicho nombre (qnamelen).(qname) y la longitud de dicho nombre (qnamelen).
Se crea un paquete con la pregunta : Se crea un paquete con la pregunta :
Se rellenan los campos de la cabecera (estructura HEADER) :Se rellenan los campos de la cabecera (estructura HEADER) :
hp.id = CodPaquete; hp.id = CodPaquete; hp.qr = 0; hp.qr = 0; // PREGUNTA // PREGUNTA hp.opcode = 0; hp.opcode = 0; // PREGUNTA // PREGUNTA
ESTANDAR ESTANDAR hp.z = 0; hp.z = 0; // Z DEBE ESTAR A 0// Z DEBE ESTAR A 0hp.qdcount = htons(1); hp.qdcount = htons(1); // NUMERO // NUMERO
DE PREGUNTAS DE PREGUNTAS hp.tc = 0; hp.tc = 0; // NO TRUNCAR// NO TRUNCARhp.rd = 1; hp.rd = 1; // PREGUNTA // PREGUNTA
RECURSIVARECURSIVA
Seguidamente nos encargamos de la pregunta :Seguidamente nos encargamos de la pregunta :
1 - Llamamos a la función CodificaNombre1 - Llamamos a la función CodificaNombre2 - Pedimos al usuario el tipo de 2 - Pedimos al usuario el tipo de
interrogación que desea y ponemos la interrogación que desea y ponemos la clase a 1 (IN). clase a 1 (IN).
Se devuelve el tamaño del paquete creado.Se devuelve el tamaño del paquete creado.
3737
FUNCIONESFUNCIONES
int DecodificaPaquete(u_char *buf, int buflen)int DecodificaPaquete(u_char *buf, int buflen)
Recibe un puntero al inicio del paquete (buf), la longitud del Recibe un puntero al inicio del paquete (buf), la longitud del paquete (buflen).paquete (buflen).
Muestra la información que contiene el paquete de respuesta.Muestra la información que contiene el paquete de respuesta. Va accediendo a las posiciones de memoria de la cabecera, la Va accediendo a las posiciones de memoria de la cabecera, la
pregunta (QNAME, tipo y clase) y los registros de recursos (para pregunta (QNAME, tipo y clase) y los registros de recursos (para mostrar los datos se hace uso de la función MuestraRR).mostrar los datos se hace uso de la función MuestraRR).
int main(int argc, char **argv)int main(int argc, char **argv)
Recibe como parámetros el nº argumentos y los argumentos Recibe como parámetros el nº argumentos y los argumentos (dirección IP (dirección IP
del servidor y el nombre de dominio).del servidor y el nombre de dominio). Si el nombre de dominio no acaba en punto se le añade.Si el nombre de dominio no acaba en punto se le añade. Se inicializa y crea el socket (puerto 53 UDP)Se inicializa y crea el socket (puerto 53 UDP) Empaquetamos (función ConstruyePaquete) y enviamos el Empaquetamos (función ConstruyePaquete) y enviamos el
paquete.paquete. Recibimos la respuesta y la desempaquetamos (función Recibimos la respuesta y la desempaquetamos (función
DecodificaPaquete)DecodificaPaquete)
CODIGO
3838
FINFIN
Recommended