Networking host byte order -> network byte order... hä?



  • Irgendwie fühl ich mich grad total als DEN idioten. Also, mein problem is total simpel, aber ich kapiers irgendwie nicht, und ich hasse verständnisprobleme.

    Folgendermassen (und es tut mir leid, dass ich das hier poste, wobei sich vermutlich der eine oder andere an den kopf fassen wird):

    Wenn ich Daten via Netzwerk verschicke, so werden die ins big-endian-format gebracht, wenn die maschine auf welcher ich die daten vor dem versand gespeichert hatte das big-endian format verwendet, so sollte htons/htonl doch nichts an der Variablen ändern oder?

    Meine frage lautet nun: WESHALB macht htons in diesem falle nichts? kann die maschine erkennen, ob eine zahl bereits im big-endian-format ist oder wie? warum wird z.B. eine 32bit integer zahl welche vor dem versand noch durch htonl() ins richtige format gebracht wurde in der netzwerkkarte nicht wieder umgedreht? und schliesslich im little-endian format verschickt??

    Ich hab das mal getestet und das Resultat zeigt, dass die maschine nicht erkennen kann, ob etwas bereits in big-endian-format ist:

    #include <stdio.h>
    #include <arpa/inet.h>
    
    int main(int argc, char *argv[])
    {
    	int zahl;
    
    	zahl = 123456789;
    
    	printf("Zahl: %d\n", zahl);					// Zahl: 123456789
    	zahl = htonl(zahl);
    	printf("htonl(Zahl): %d\n", zahl);			// htonl(Zahl): 365779719
    	zahl = htonl(zahl);
    	printf("htonl(htonl(Zahl)): %d\n", zahl);	// htonl(htonl(Zahl)): 123456789
    } // main
    

    Um zu erkennen, ob sich eine zahl bereits im big-endian-format befindet müsste man ja auch noch das "gewicht" der einzelnen bits kennen, was ja nicht mitgespeichert wird....

    Ich hoffe ich konnte mein Problem einigermassen einleuchtend schildern. Danke schon jetzt für erhellende Antworten.



  • htons sind nicht so intelligent, wie Du denkst. Die stellen einfach um, egal, was sie kriegen. Nur halt auf Maschinen nicht, die eh schon in network byte order arbeiten.



  • 🙂 hahaha, naja so kurz die Antwort auch war, so einleuchtend ist sie. Danke danke.



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum C (C89 und C99) in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • isam2k schrieb:

    kann die maschine erkennen, ob eine zahl bereits im big-endian-format ist oder wie?

    wie soll ein Algorithmus aussehen, der erkennt, dass die Folgende Zahlenfolge eine Zahl in big oder little endian gespeichert ist?

    0xde 0xad 0xbe 0xef

    ??? ist das jetzt 0xdeadbeef oder doch 0xefbeadde? Also, ich kann das nich einmal als Mensch erkennen, ob diese Zahlenfolge bereits in big endian ist oder nicht, da ich nicht in deinen Kopf schauen kann und das kann htonl leider auch nicht.



  • supertux schrieb:

    wie soll ein Algorithmus aussehen, der erkennt, dass die Folgende Zahlenfolge eine Zahl in big oder little endian gespeichert ist?

    0xde 0xad 0xbe 0xef

    ??? ist das jetzt 0xdeadbeef oder doch 0xefbeadde? Also, ich kann das nich einmal als Mensch erkennen, ob diese Zahlenfolge bereits in big endian ist oder nicht, da ich nicht in deinen Kopf schauen kann und das kann htonl leider auch nicht.

    Äääh... ja, darum hab ich auch geschrieben:

    Um zu erkennen, ob sich eine zahl bereits im big-endian-format befindet müsste man ja auch noch das "gewicht" der einzelnen bits kennen, was ja nicht mitgespeichert wird....

    Wenn das Gewicht der einzelnen bits mitgespeichert würde, so wäre ein Algorithmus, welcher erkennt, ob eine Zahl nun big endian oder little endian ist noch nicht mal so schwer zu finden. Da dies aber kompletter Blödsinn ist, und mir auch klar ist dass man einer Bitfolge eben nicht ansieht ob sie big endian oder little endian ist hab ich die Frage hier gepostet, wie das denn funktioniert. Die erste Antwort von SG1 war absolut ausreichend und klar.
    Was du (supertux) hingegen schreibst ist mehr oder weniger eine Wiederholung meiner Frage.



  • Ich wusste nicht, ob es dir schon klar war oder nicht, da ich lange Zeit den Thread offen hatte und gar nicht merkte, dass SG1 bereits geantwortet hat.


Log in to reply