Pergunta

Desenvolvimento de uma aplicação de rede e usando o socket Api.

Eu quero definir sin6_addr de ordem de byte de sockaddr_in6 estrutura.

Para 16 bits ou 32 bits variáveis, é simples:Usando htons ou htonl:

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

Mas para 128 bits variáveis, eu não sei como definir a ordem de bytes da rede da ordem 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?

Algumas respostas podem estar usando htons 8 vezes (2 * 8 = 16 bytes), ou usando htonl por 4 vezes (4 * 4 = 16 bytes), mas eu não sei qual é o caminho correto.

Obrigado.

Foi útil?

Solução

O s6_addr membro do struct in6_addr é definido como:

uint8_t s6_addr[16];

Pois é uma matriz de uint8_t, ao invés de ser uma única 128-bit tipo de número inteiro, o problema de ordenação não surgir:você simplesmente copiar a partir de sua fonte uint8_t [16] matriz para o destino.Por exemplo, para copiar o endereço 2001:888:0:2:0:0:0:2 você usaria:

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);

Outras dicas

A coisa usual seria a utilização de um hostname pesquisa de rotinas e utilizar o resultado de que, o que já está em network byte order.Como você está lidando com codificado endereços IP numéricos em tudo?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top