Verständnis htonl() und ntohl()

Ich versuche, mit unix-sockets zu testen, senden einige udp-Pakete an localhost.

Es ist mein Verständnis, dass wenn die Einstellung ip-Adresse und port für den Versand der Pakete, die ich füllen würde meine sockaddr_inmit Werten konvertiert, um Netzwerk-byte-Reihenfolge.
Ich bin auf OSX und ich bin erstaunt, dass diese

printf("ntohl: %d\n", ntohl(4711));
printf("htonl: %d\n", htonl(4711));
printf("plain: %d\n", 4711);

Drucke

ntohl: 1729232896
htonl: 1729232896
plain: 4711

Also weder Funktion tatsächlich liefert den einfachen Wert. Ich hätte erwartet, um zu sehen, entweder die Ergebnisse unterscheiden sich, wie x86 ist little-endian (afaik), oder identisch sein und die gleiche wie die aktuelle Nummer 4711. Klar ich verstehe nicht, was htonl und ntohl und Ihre Varianten. Was bin ich?

Der relevante code ist:

int main(int argc, char *argv[])
{
   if (argc != 4)
   {
      fprintf(stderr, "%s\n", HELP);
      exit(-1);
   }

   in_addr_t rec_addr = inet_addr(argv[1]); //first arg is '127.0.0.1'
   in_port_t rec_port = atoi(argv[2]);      //second arg is port number
   printf("Address is %s\nPort is %d\n", argv[1], rec_port);
   char* inpath = argv[3];

   char* file_buf;
   unsigned long file_size = readFile(inpath, &file_buf); //I am trying to send a file
   if (file_size > 0)
   {
      struct sockaddr_in dest;
      dest.sin_family      = AF_INET;
      dest.sin_addr.s_addr = rec_addr; //here I would use htons
      dest.sin_port        = rec_port;
      printf("ntohs: %d\n", ntohl(4711));
      printf("htons: %d\n", htonl(4711));
      printf("plain: %d\n", 4711);
      int socket_fd = socket(AF_INET, SOCK_DGRAM, 0);
      if (socket_fd != -1)
      {
         int error;
         error = sendto(socket_fd, file_buf, file_size + 1, 0, (struct sockaddr*)&dest, sizeof(dest));
         if (error == -1)
            fprintf(stderr, "%s\n", strerror(errno));
         else printf("Sent %d bytes.\n", error);
      }
   }

   free(file_buf);
   return 0;
}
Beachten Sie, dass Ihr text sagt, "htons" und "ntohs", aber Sie sind eigentlich aufrufen htonl() und ntohl().
Ja, das kam aus versuchen beide, mit dem gleichen Ergebnis, danke für die Bemerkung.

InformationsquelleAutor oarfish | 2016-04-28

Schreibe einen Kommentar