Netzwerk fragen



  • Also ich habe folgendes Problem. Ich bin gerade da bei ein Programm zum kopieren von Dateien in einem Netzwerk zu schreiben. Als erstes kopiere ich die Daten mithilfe von fread in einen String.

    Erstes Problem: An die Daten soll nun die Segmentnummer an die Daten angehängt werden. Diese Nummer muss 8 Zeichen lang sein damit sie sich dann leichter von den Daten trennen lässt. So würde ich es machen: ich lege über die zahl per pointer ein Arrey und kopieren den Inhalt. Ist nur die Frage ob es eine Bessere Methode gibt.

    Zweites Problem: Diese Daten müssen ja jetzt durchs Netzwerk. Dazu müssen diese ja jetzt von Host Byte Order in Network Byte Order umgewandelt werden (ähnlich wie htons und co. es mit zahlen machen). Nun ist die Frage wie die Funktion dafür heißt wie man sie benutzt in welcher Headerdatei sie liegt und wo man sie diese bekommt. Natürlich brauche ich auch das Gegenstück zu dieser Funktion.

    So far decola



  • De Cola schrieb:

    Erstes Problem: An die Daten soll nun die Segmentnummer an die Daten angehängt werden. Diese Nummer muss 8 Zeichen lang sein damit sie sich dann leichter von den Daten trennen lässt.

    wozu brauchst du diese nummer?
    ich würde sie ja eher vorn statt hinten anhängen.

    De Cola schrieb:

    So würde ich es machen: ich lege über die zahl per pointer ein Arrey und kopieren den Inhalt. Ist nur die Frage ob es eine Bessere Methode gibt.

    vielleicht einfach 'memcpy' nehmen?

    De Cola schrieb:

    Zweites Problem: Diese Daten müssen ja jetzt durchs Netzwerk. Dazu müssen diese ja jetzt von Host Byte Order in Network Byte Order umgewandelt werden (ähnlich wie htons und co. es mit zahlen machen). Nun ist die Frage wie die Funktion dafür heißt wie man sie benutzt in welcher Headerdatei sie liegt und wo man sie diese bekommt. Natürlich brauche ich auch das Gegenstück zu dieser Funktion.

    ich glaube nicht, dass du die daten umwandeln musst (jedenfalls nicht, wenn du rohdaten versendest).
    btw:
    htons/htonl zurückverwandeln geht wieder mit htons/htonl.
    auf einem little-endian system vertauschen htons/htonl die bytes.
    auf einem big-endian system machen sie nichts
    dann gibts noch ntohs/ntohl, die heissen nur anders, machen aber das selbe 🙂



  • Ich brauche die nummer damit das programm weiß um welchen teil der datei es sich handelt. hinten oder vorn ist ganz egal.

    Ich meine gelesen zu haben gerade bei rohdaten braucht man ein umwandler (ich will ja Binär daten verschicken). wer es besser weiß sagt es bitte und warum.



  • decola schrieb:

    Ich meine gelesen zu haben gerade bei rohdaten braucht man ein umwandler (ich will ja Binär daten verschicken). wer es besser weiß sagt es bitte und warum.

    du brauchst nix umwandeln bei rohdaten, die bytes kommen in der gleichen reihenfolge an, wie du sie verschickt hast.
    htons/htonl braucht man z.b., wenn man multibyte-werte in irgendwelchen genormten protokollheadern schreiben/lesen will. die sind meistens alle big-endian (hi-byte ganz vorne), sonst sendest du z.b. 0x1234 (vom PC) und am anderen ende kommt aber 0x3412 an, weil x86 PCs intern 2-byte werte falsch herum speichern.
    ...aber bei rohdaten (byte-arrays) brauchst du's nicht, denn für den dummen PC-x86 sind es ja keine ints/longs etc., sondern eben nackte daten.
    🙂



  • pale dog schrieb:

    htons/htonl zurückverwandeln geht wieder mit htons/htonl.

    ntohs/ntohl braucht das Zielsystem/Empfänger und htons/htonl der Sender. Aber natürlich stimmt es, dass in jedem Fall nur umgewandelt wird, wenn es auch nötig ist.



  • deetee schrieb:

    pale dog schrieb:

    htons/htonl zurückverwandeln geht wieder mit htons/htonl.

    ntohs/ntohl braucht das Zielsystem/Empfänger und htons/htonl der Sender.

    ist egal, htons tut dasselbe wie ntohs und htonl und ntohl sind auch identisch.
    🙂



  • 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.



  • 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...
    🙂


Anmelden zum Antworten