Netzwerk fragen
-
deetee schrieb:
Man kann aber für das Empfangen nicht htons/htonl nehmen, oder umgekehrt für das Senden ntohs/ntohl. Also haben alle 4 ihren Sinn und Zweck und man muss sie gezielt einsetzen.
Das wollte ich damit nur sagen, deine Aussage könnten manche falsch verstehen.ich kann mich natürlich täuschen. probier's doch mal aus.
ich bin mir ziemlich sicher, dass htons/ntohs usw. das selbe machen.btw:
aber, was sein kann: auf systemen mit einem ganz exotischen format für multibyte-werte (weder big- noch little-endian), kann es sein, dass htons etc. nicht ihre eigenen umkehrfunktionen sind.
-
Verstehst du eigentlich was ich sagen will?
Also nochmal, wenn du übers Netzwerk ein INT schickst und Sender und Empfänger sind Little Endian Systeme, was machst du dann, damit die Zahl korrekt übermittelt wird?
Sender Seite: ?
Empfänger Seite: ?
-
deetee schrieb:
Also nochmal, wenn du übers Netzwerk ein INT schickst und Sender und Empfänger sind Little Endian Systeme, was machst du dann, damit die Zahl korrekt übermittelt wird?
nichts, einfach nur senden. wenn beide systeme gleiche endianess haben braucht nix konvertiert zu werden. :p
wenn man aber ein protokoll verwendet, bei dem spezifiziert ist, dass multibyte-werte big-endian sein müssen, dann musst du auf beiden systemen konvertieren.
soll der code portabel sein, dann müssen die umwandlungsfunktionen auf jeden fall rein.
-
ok und jetzt nehmen wir an Sender ist little und Empfänger big, wo wendest du welche Funktion an?
Wenn beide Funktionspaare das gleiche machen würden, wie du es sagst, dann wäre es egal, wo man welche Funktionen verwendet...ist es aber nicht.
-
deetee schrieb:
ok und jetzt nehmen wir an Sender ist little und Empfänger big, wo wendest du welche Funktion an?
wenn ich jetz mal alles missachte, also protokoll und portabilität, dann muss nur einer von beiden die konvertierfunktion aufrufen, damit der andere die daten richtig rum bekommt.
deetee schrieb:
Wenn beide Funktionspaare das gleiche machen würden, wie du es sagst, dann wäre es egal, wo man welche Funktionen verwendet...ist es aber nicht.
das ist nur nicht egal, wenn der code portabel sein muss, denn es könnte ja einer dabei sein, der weder big- noch little-endian nutzt, sondern die bytes (oder gar einzelne bits) in einer ganz unorthodoxen weise intern speichert.
beispiel, ein htons() für little/big endian konvertierung könnte so aussehen:
#define htons(x) ((x)<<8|(x)>>8)
gibst du dem 0x1234 dann macht der daraus 0x3412.
gibst du ihm 0x3412 dann macht er wieder 0x1234 daraus.
und deshalb gilt auch:#define ntohs(x) htons(x)
-
Okay hier kommt das nächste problem gibt es ntohl usw. auch für long long zahlen ? wenn ja würde ich gern den name und headerdatei wissen.
-
in winsock.h (oder auch winsock2.h) gibts die funktion (die du schon erwähnt hast ;)) ntohl wobei das 'l' für long steht, das 's' für short (network to host byte order short/long)
-
De Cola schrieb:
...Arrey...
lol, das heißt doch Errej
-
curry-king schrieb:
De Cola schrieb:
...Arrey...
lol, das heißt doch Errej
ja das is mir auch kla *gg*.
ich meinte ntohl für LONG LONG also richtig große zahlen hab es mit ntohl bereits ausprobiert klappt aber nicht.
-
dracula schrieb:
ich meinte ntohl für LONG LONG also richtig große zahlen hab es mit ntohl bereits ausprobiert klappt aber nicht.
vielleicht
longlonggedreht = htonl(*(long*)&x)<<32 | htonl(*((long*)&x+1))
leider plattformabhängig, irgendwo gibt's auch ein htonll.
oder komplett selber machen...