Winsock send() mit short Werten anstelle von chars.



  • Ich möchte per Winsock ein paar Zahlen verschicken. Das Problem ist nur, dass mir die Werte als SHORT vorliegen. bsp.: wave[25] entspricht -13446.

    Die Send() funktion die in windows.h definiert ist kann aber nur char verschicken. Wie kann ich short in char konvertieren? SOwohl für send als auch für recv().

    int send ( SOCKET s,
    const char FAR * buf,
    int len,
    int flags );



  • Ein char reicht da ja für einen SHORT nicht aus, aber probier mal einfach der SHORT * nach char * zu casten und nachher wieder zurück 🙄



  • Danke für die schnelle Antwort, aber ich bin zu dumm 😉

    Ich hab einen Buffer von 16 short wave[16][1]. Den einen Buffer mit 8192 will ich per winsock send() verschicken.

    rc = send(s,(const char*)wave,6,0);
    

    ???

    Irgendwie versteh ich das mit dem casten nicht wirklich 😉



  • 1.) Wieso hast du für die Länge 6 angegeben?
    2.) Wieso hast du ein mehrdimensionales Array?
    3.) was für Fehler bekommst du?



  • Sorry für die ungenauen beschreibungen.

    - Also ich habe 16 Buffer und in jedem Buffer sind 8192 short werte (glaube ich).
    - Ich möchte einen von den 16 Buffern über send() verschicken.
    - Danach soll er zum 2. Buffer springen und auch verschicken über send()

    Dazu muss ich erstmal alle 8192 short werte aus dem Array in char konvertieren!
    Das macht man mit cast*?! Hast du nen code-schnippsel? 🙂

    Nun folgt der Send() Befehl ...

    ... und am Ende muss er Empfänger das Ganze wieder umkonvertieren.

    Meine Fragen dazu:
    1.)Ist es wirklich sinnvoll nen ganzen Buffer mit 8192 Werten per SEND() zu verschicken? Weniger wäre sicherlich besser!?

    2.) Wie funktioniert das mit der konvertierung eines short arrays in ein char array?

    Danke für dein Durchhaltevermögen 😉



  • 1.) Wieso hast du für die Länge 6 angegeben?

    Weil meine short Werte z.B. 19283 sind 🙂



  • Lacri schrieb:

    Ist es wirklich sinnvoll nen ganzen Buffer mit 8192 Werten per SEND() zu verschicken? Weniger wäre sicherlich besser!?

    Das musst du schon selber wissen, ob du diese Daten beim Empfänger alle benötigst 😉

    Lacri schrieb:

    Wie funktioniert das mit der konvertierung eines short arrays in ein char array?

    Du konvertierst ja im Prinzip keine Daten, sondern biegst nur den Pointer um, sodass der Compiler nicht meckert 🙄

    Lacri schrieb:

    flenders schrieb:

    Wieso hast du für die Länge 6 angegeben?

    Weil meine short Werte z.B. 19283 sind 🙂

    Du musst hier die Anzahl der chars bzw. Bytes (1 char = 1 Bytes) angeben, die übertragen werden sollen 😉

    Ich hatte mir das irgendwie so vorgestellt (keine Ahnung, ob das so klappt 😉 ):

    // z.B. um den ersten Buffer (wave[0]-Array) zu versenden
    rc = send(s,(char *)wave[0],sizeof(wave[0]),0);
    


  • for (int xyz = 0; xyz < wave_size ; xyz++){
    							cout << xyz<<" - " << wave[xyz] << endl;
    						// VON SHORT NACH CHAR CASTEN
    							rc = send(s,(char *)wave[0],sizeof(wave[0]),0);}
    

    EMPFÄNGER:

    for (int xyz = 0; xyz < 25; xyz++){
    						rc=recv(connectedSocket,(char *)buf,6,0); //stinglänge 6
    						cout << "Wir empfangen gerade: " << buf[xyz] << endl;}
    

    Ausgabe empfänger:
    Wir empfangen gerade: [|
    Wir empfangen gerade: [|
    Wir empfangen gerade: [|
    Wir empfangen gerade: [|
    Wir empfangen gerade: [|
    ...

    😞 😞 😞



  • Ich glaube du solltest mal etwas mehr Code zeigen 🙄
    Ich ging nämlich davon aus, dass du z.B. folgendes Array hast:

    SHORT wave[16][1024];
    

    also, dass du quasi 16 Buffer hast, die jeweils 1024 Werte aufnehmen können. Um jetzt einen von diesen zu übertragen rufst du einmal

    for (int xyz = 0; xyz < 1024; xyz++) { 
     cout << xyz << " - " << wave[0][xyz] << endl;
    }
    send(s,(char *)wave[0],sizeof(wave[0]),0);
    

    auf, um die 1024 Werte des ersten Buffers zu übertragen. Auf der Empfängerseite rufst du jetzt einmal recv auf und castest die Daten wieder zurück nach SHORT (bzw. castest den SHORT Buffer für recv nach char *). z.B. so:

    SHORT wave[16][1024];
    recv(connectedSocket,(char *)wave[0],sizeof(wave[0]),0);
    for (int xyz = 0; xyz < 1024; xyz++) { 
     cout << xyz << " - " << wave[0][xyz] << endl;
    }
    

    So in der Art hatte ich mir das zumindest vorgestellt - ob's auch funktioniert weiß ich nicht (hab noch nie was damit gemacht)



  • FUNZT !!!
    Danke du bist ein Schatz 😉
    Ich werd mich auf jeden Fall jetzt häufiger hier blicken lassen und vielleicht kann ich ja auch irgendwann mal jemandem helfen 😛


Anmelden zum Antworten