Winsock Send Problem



  • Client :

    char buf2[100];
    recv(server, buf2, 100, 0);
    MessageBox(0,buf2,buf2,0);
    

    Server :

    class Testclass{
    public:
    	char buf1[50];
    	char buf2[50];
    };
    
    // .............
    
    Testclass test;
    strcpy(test.buf1, "test1");
    strcpy(test.buf2, "test2");
    
    send(s, reinterpret_cast<char*> (&test), sizeof(test), 0);
    

    Es kommt aber nur an der Inhalt von buf1. Was is da falsch ?



  • wegen der nullterminierung?



  • Das heisst ?



  • Wäre es nicht sicherer beide Strings nacheinander zu senden statt ein Objekt zu versenden und dann als String zu empfangen ?

    Achja: Aufpassen mit recv()! recv() weiss nicht was mit send() gesendet wurde und es ist nicht garantiert das recv() den kompletten buffer mit den gewünschten 100 Bytes füllt! Siehe Rückgabewert von recv()!
    (Soeben gebaut: http://www.geeky.de/dev/tnt/winapi/Winsock und recv.pdf)



  • PhoeNix_FasT schrieb:

    Das heisst ?

    Leute die keine Ahnung haben von Software-Design, Algorithmen oder auch der Sprache mit der sie programmieren sind ein grosses, echtes Problem. Oder Leute die auf Fehlerbehandlung scheissen, Sonderfälle erst dann entdecken und Code dafür schreiben wenn man sie mit der Nase darauf stösst etc. Solche Leute schreiben Code der richtig weh tut, der einem lange nachhängt, der schwer zu fixen ist.



  • Och man, helft dem Jungen doch mal!

    Dein String den du empfängst, sieht so aus:
    test1\0test2\0

    Bei ner Ausgabe wird nur bis "test1" ausgegeben weil ein \0 immer einen String beendet (=terminiert). Also einfach hinter "test1\0" gehen und auch ausgeben lassen 😉



  • Kurz: Du überträgst 'alles' (siehe geeky's Hinweis!) 😉 .



  • wisser schrieb:

    PhoeNix_FasT schrieb:

    Das heisst ?

    Leute die keine Ahnung haben von Software-Design, Algorithmen oder auch der Sprache mit der sie programmieren sind ein grosses, echtes Problem. Oder Leute die auf Fehlerbehandlung scheissen, Sonderfälle erst dann entdecken und Code dafür schreiben wenn man sie mit der Nase darauf stösst etc. Solche Leute schreiben Code der richtig weh tut, der einem lange nachhängt, der schwer zu fixen ist.

    Pfui, geklaut 😃 Möchte aber darauf hinweisen dass _ich_ das _hier_ _nicht_ reingepostet habe.



  • Noch ein paar Tipps: Ich würde die Daten nicht in eine Klasse, sondern eher in eine Struktur verpacken. Wenn du die Daten in einer Klasse hast, die virtuelle Funktionen beinhaltet, ist sie 4 Byte größer wegen dem V-Table; die 4 Byte werden dann natürlich auch mitgeschickt und sorgen evtl für Verwirrung.
    Wenn du aber sicher weißt, dass die Klasse keine virtuellen Funktionen hat oder von einer anderen Klasse welche erbt, kannst du es ruhig so machen. Wollte es nur anmerken 🙂 .

    Und zum empfangen wäre es wahrscheinlich auch einfacher, wenn du die Daten gleich in der Struktur/Klasse empfängst.
    Also in etwa so:

    class Testclass{
    public:
        char buf1[50];
        char buf2[50];
    };
    Testclass Klasse;
    recv( server, &Klasse, 100, 0);
    MessageBox( 0, Klasse.buf1, "", 0);
    MessageBox( 0, Klasse.buf2, "", 0);
    

    🤡

    Edit: Jaja, die Unregistrierten werden immer dreister 😃



  • Ja Kinder halt.
    Egal danke das hat mir geholfen


Anmelden zum Antworten