Forum: PC-Programmierung Client - Server - Socket - Zwei Integer übertragen


von Thuy Nguyen (Gast)


Lesenswert?

Hallo allesamt,

ich muss für die Schule einen Client in C schreiben, der über Sockets 
zwei Integer Werte an einen Server übermittelt.

Das Verbinden und Senden funktioniert einwandfrei. Jedoch wurde dem 
Server eine "merkwürdige" Funktion implementiert. Und zwar sollen die 
beiden Integerzahlen in einem Buffer übermittelt werden und 
folgendermaßen entpackt werden:

1
void entpackeWerte(unsigned char *buffer, unsigned int *x, unsigned int *y)
2
{
3
   *x = (buffer[0] << 8) | buffer[1];
4
   *y = (buffer[2] << 8) | buffer[3];
5
}

Ich verstehe das nicht ganz. Beispiel:

Sagen wir der Wert x ist eine 2 (bzw 00000010) am Client. Ich sende 
diese Zahl via buffer[1] an den Server und er macht erstmal eine 
Linksverschiebung um 8 bits:

x = 00000010 00000000

Egal welche Zahl jetzt in buffer[1] steckt.. ich bekomme auch mit dem 
|-Operator doch MINIMAL einen Wert von 100000000. Also kann das nicht 
die Lösung sein.

Sende ich die Zahl 2 im buffer[1] und sage buffer[0] = 0, dann erhalte 
ich garkeinen Wert.

Kann mir jemand helfen?
Danke!

Kann mir jemand

von Peter II (Gast)


Lesenswert?

Thuy Nguyen schrieb:
> Sagen wir der Wert x ist eine 2 (bzw 00000010) am Client. Ich sende
> diese Zahl via buffer[1] an den Server und er macht erstmal eine
> Linksverschiebung um 8 bits:

x ist doch egal. Die Frage ist was in buffer stehen soll. Nach den code 
sollen dort 4 Byte drin stehen. Diese werden dann in X und Y aufgeteilt.

von Konrad S. (maybee)


Lesenswert?

1
buffer[0] = 0;
2
buffer[1] = 2;
3
printf( "%d\n", (buffer[0] << 8) | buffer[1] );

Probier's mal aus.

von T.N. (Gast)


Lesenswert?

Konrad S. schrieb:
> buffer[0] = 0;
> buffer[1] = 2;
> printf( "%d\n", (buffer[0] << 8) | buffer[1] );
> Probier's mal aus.

Ich habe es ausprobiert, aber leider funktioniert es nicht, wenn eine 
der Variablen den Wert 0 besitzt auf dem "Server"

wenn ich es mit printf ausgeben lasse innerhalb des Programm 
funktioniert es für Zahlen unter 256

von Konrad S. (maybee)


Lesenswert?

T.N. schrieb:
> aber leider funktioniert es nicht

Mach es nicht komplizierter, als es ist:
1
#include <stdio.h>
2
3
int main( void )
4
{
5
    unsigned char buffer[2];
6
    buffer[0] = 0;
7
    buffer[1] = 2;
8
    printf( "%d\n", (buffer[0] << 8) | buffer[1] );
9
    return 0;
10
}
Was bekommst du als Ergebnis?

von T.N. (Gast)


Lesenswert?

Konrad S. schrieb:
> int main( void )
> {
>     unsigned char buffer[2];
>     buffer[0] = 0;
>     buffer[1] = 2;
>     printf( "%d\n", (buffer[0] << 8) | buffer[1] );
>     return 0;
> }

Gebe ich es exakt so ein, kommt natürlich eine 2 raus.

Ändere ich den Text zu "buffer[1] = 256" erhalte ich eine 0 !

Versuche ich den buffer per connect an den Server zu übermitteln, 
passiert gar nichts.

von Konrad S. (maybee)


Lesenswert?

T.N. schrieb:
> Ändere ich den Text zu "buffer[1] = 256" erhalte ich eine 0 !

Und welchen Datentyp hat buffer[1]?

Welcher Wert steht in buffer[1] nach deiner Zuweisung?
1
printf( "%d\n", buffer[1] );

von Rolf Magnus (Gast)


Lesenswert?

T.N. schrieb:
> Konrad S. schrieb:
>> int main( void )
>> {
>>     unsigned char buffer[2];
>>     buffer[0] = 0;
>>     buffer[1] = 2;
>>     printf( "%d\n", (buffer[0] << 8) | buffer[1] );
>>     return 0;
>> }
>
> Gebe ich es exakt so ein, kommt natürlich eine 2 raus.
>
> Ändere ich den Text zu "buffer[1] = 256" erhalte ich eine 0 !

Natürlich. Wie groß ist buffer[1]? Welches ist der maximale Wert, der da 
drin stehen kann? Was muß also passieren, wenn du da 256 reinschreibst?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.