2011-05-17 13 views
7

Desarrollo de una aplicación de red y uso de API de socket.Cómo establecer el orden de byte sockaddr_in6 :: sin6_addr en orden de bytes de red?

Quiero establecer el orden de byte sin6_addr de la estructura sockaddr_in6.

Durante 16 bits o 32 variables de bits, es simple: El uso de htons o htonl:

// IPv4 
sockaddr_in addr; 
addr.sin_port = htons(123); 
addr.sin_addr.s_addr = htonl(123456); 

Pero para las variables de 128 bits, que no saben cómo establecer el orden de bytes de red orden de bytes:

// IPv6 
sockaddr_in6 addr; 
addr.sin6_port = htons(123); 
addr.sin6_addr.s6_addr = ??? // 16 bytes with network byte order but how to set? 

Algunas respuestas pueden estar usando htons por 8 veces (2 * 8 = 16 bytes), o usando htonl por 4 veces (4 * 4 = 16 bytes), pero no sé cuál es la correcta.

Gracias.

Respuesta

9

El s6_addr miembro de struct in6_addr se define como:

uint8_t s6_addr[16]; 

Dado que es una matriz de uint8_t, en lugar de ser un solo tipo de número entero de 128 bits, la cuestión de endianness no se plantea: simplemente copia desde su fuente uint8_t [16] matriz hasta el destino. Por ejemplo, para copiar en la dirección de 2001:888:0:2:0:0:0:2 se debería utilizar:

static const uint8_t myaddr[16] = { 0x20, 0x01, 0x08, 0x88, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02 }; 

memcpy(addr.sin6_addr.s6_addr, myaddr, sizeof myaddr); 
1

Lo habitual sería utilizar una de las rutinas de búsqueda de nombre de host y usar el resultado de eso, que ya está en orden de bytes de red. ¿Cómo es que manejas las direcciones IP numéricas codificadas?

+0

sinceramente, desarrollar una biblioteca. Existen algunas limitaciones para acceder al nombre de host. –

+0

@Amir Saniyan ¿Qué limitaciones? Toda la Internet usa nombres de host en lugar de direcciones IP, y delega estos a una base de datos llamada DNS. ¿Qué hay de diferente en tu situación? En cualquier caso, todo lo que tiene que hacer es almacenar la dirección IP en octetos, es decir, bytes, en el mismo orden en que los escribiría, y el trabajo hecho. – EJP

Cuestiones relacionadas