Ne sin_addr.s_addr = INADDR_ANY; besoin htonl à tous?

Je suis tombé sur deux threads:

Prise avec recv-délai d'attente: Quel est le problème avec ce code?

Lecture /Écriture à une prise secteur à l'aide d'un flux de FICHIER en c

on utilise htonl et l'autre n'a pas.

Qui est à droite?

  • +1 pour essayer de faire la lumière sur une confusion de la zone: le top hit sur Google n'est même pas sûr: tech-archive.net/Archive/Development/... - le message lié dit (assez convaincante) que htonl n'est pas nécessaire pour ces constantes, alors le message de suivi retire de la déclaration, disant htonl est nécessaire!
  • Ce n'est pas une confusion de la zone. Si vous connaissez la valeur numérique de INADDR_ANY, il est clair que htonl() ne fait rien pour le résultat, zéro dans les résultats de zéro; de même, pour INADDR_ALL, 0xFFFFFFFF à htonl() résultats dans 0xFFFFFFFF out. Cependant, INADDR_LOOPBACK est différent: il est spécifié dans l'ordre des octets de réseau comme 0x7F000001. Pour cette constante, l'utilisation de htonl() est nécessaire.
  • Vous pouvez lire (et downvote!) ma réponse ci-dessous. Je l'ai écrit avant @Mat mis à jour sa réponse pour dire que htonl doit être utilisé, après tout. Juste parce que vous dites cette zone ne crée pas de confusion à ne pas faire en sorte (et la preuve, c'est que un certain nombre de gens qui trouvent à confusion).
  • Il est source de confusion dans la mesure où les gens n'ont pas établi leur base de connaissances dans le domaine. Si le programmeur ne peut pas lire de la sortie de ifconfig, netstat, tcpdump, puis ils vont être rien, mais confus. Si ils ont des connaissances de base de ce domaine, ils ne seront pas confus.
  • Le point est INADDR_ANY/INADDR_LOOPBACK ne pas avoir une valeur spécifiée. Il est clair sur votre machine, comment il fonctionne, mais qui pourrait ne pas être univerally vrai (ou peut - qui est ce que la question est à propos)
  • Ma machine est probablement filaire à votre ordinateur ou à votre réseau sans fil hub. À un certain niveau, ils ne fonctionnent de la même, la manière spécifiée par l'IETF Rfc. C'est pas par hasard que les sockets Berkeley API traite les constantes de cette façon -, mais les avocats de l'encapsulation et d'abstraction suggère que nous prétendons, c'est une coïncidence.
  • Les Rfc ne précise pas que INADDR_LOOPBACK devrait être 0x7F000001 ou, par exemple, 0x100007F.
  • Sauf si vous pouvez penser à tous les cas où INADDR_LOOPBACK ne serait pas 127.0.0.1, je dirai qu'il sera toujours 0x7f000001.

InformationsquelleAutor compile-fan | 2011-05-21