Pergunta

Quando eu enviar uma variável inteiro de um processo para outro através da tomada, e, em seguida, imprimir o valor no final recebido, o valor ainda é o mesmo sem usar ntohl / htonl, então onde eu preciso para usar essas diferentes inicializar funções estruturas de soquete. Eu entendo litte / big endian. Mas por que precisamos para converter porto e IP nºs a ordem de byte host / rede quando o valor permanece o mesmo. Por favor, explique em detalhes como o número inteiro é tranferred através da rede?

Foi útil?

Solução

Se você quer que seu programa para ser portátil, então qualquer momento que você enviar um maior número inteiro de 1 byte de tamanho ao longo da rede, você deve primeiro convertê-lo em ordem de bytes de rede usando htons ou htonl, e o computador receptor deve convertê-lo a ordem de byte host usando ntohs ou ntohl.

No seu caso, a razão que o valor ainda é o mesmo é provavelmente porque o computador de envio e o computador receptor são do mesmo endianness. Em outras palavras, o computador de envio e o computador receptor que você está trabalhando com são ambos pouco endian (ou big endian, seja qual for o caso).

Mas se você quer que seu programa para ser portátil, você não pode contar com isso para sempre ser o caso. Um dia, por exemplo, o computador de envio pode ser um Intel x86, eo receptor pode ser um Sun SPARC, e, em seguida, seu programa irá falhar se você não usar htons.

Outras dicas

Se você quiser enviar dados de um x86 ou amd64 máquina para uma máquina com um processador PowerPC, em binário formato que você vai ver rapidamente que os seus dados se encontra com o "problema NUXI" como o diferente processadores de tratar os números inteiros de forma diferente e aparecer para trocar os bytes. (Eles realmente não trocar os bytes -. Eles só trabalho com eles em uma ordem diferente)

Ao trabalhar em x86 ou amd64, o byte menos significativo vem primeiro na memória (desta forma você pode realizar a adição de baixo para endereços de memória superior). O PowerPC coloca o byte mais significativo primeiro na memória (desta forma você pode ordenar os números com base nos bytes que vêm mais cedo na memória -. Uma espécie de corda e de um tipo integer pode ser exatamente o mesmo)

É remaimns o mesmo, porque em sua arquitetura da ordem de rede é a mesma que a ordem nativa. Se você nunca antecipar compilar seu código para outra arquitetura que você poderia omitir as chamadas hton / ntoh. Seu código, então, não ser portátil.

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