Binär zahlen interpretieren
-
Hallo,
ich hatte vor einen Server für spezielle Clients zuschreiben(TCP). Das Protokoll ist so aufgebaut, dass die Pakete einen String senden:
-Die ersten 4Bytes(Zeichenfolge) - sagen ob es sich um ein Antwort-, einem Anfrage- oder Fehlerpaket handelt.
-Die nächsten 4Bytes enthalten die Länge des Pakets.
-Und der Rest den Text.Das Problem ist jetzt das die 4Bytes länge von den Clients binär gesendet wird. Und diese nicht als Binärzahl interpretieren kann.
zB.: wenn ich 4bytes lese und dem Clienten sage das er 20bytes senden soll, lese ich 3,668,040(bits/bytes?keine Ahnung)-> als dezimalzahl ausgegeben(printf %d)
HEX ausgabe -> 18F404Was ja nicht richtig sein kann. Ich erwarte ja, 20bytes 160bits A0(hex) oder ähnliches. Was mache ich falsch?
Den Client Code habe ich leider nicht(ist eine ausführbare Datei)
-
Network Byte Order?
Sehr duerftig deine Fehlerbeschreibung. Vielleicht kannst du ja Links zu den Programmen auffuegren.
PS: Wieviel Programmiererfahrung hast du?
-
Der Client schickt mir wirklich ein '0c 00 00 00'(network byte order). Ich habe diese String ausgeschnitten mit strncpy, aus dem Original String des Clients. Danach den teilstring char laenge; mit atoi in einen int umgewandelt, dann ntohl(laenge) --> bringt mir immer '0'
Codeausschnitt:
int rc = recv(hClient,buffer,sizeof(buffer),0); //--- Fehler-Block ---------------------------------------------- //--- empfangen -------------------------------------------- if(rc > 0){ buffer[rc] = 0; cout << &buffer << endl; printf("%d bytes empfangen, %s\n",rc,buffer+8); strncpy(magic,buffer,4); strncpy(laenge,buffer+4,4); laenge[4]=0; int l = atoi(laenge); //l = ntohs(l); magic[4]=0; printf("MAGIC '%s'\n",magic); printf("LAENGE '%d'\n",l); printf("Nachricht %s\n",buffer+8);
PS: Wieviel Programmiererfahrung hast du?
Genug das ich eine Server anwendung schreiben kann. Sie funktioniert auch, nur dieser Teil bereitet mir kopfschmerzen.
-
teilstring char laenge
Aber er ist doch kein String sondern binaer.
mit atoi in einen int umgewandelt
Warum, wenn er doch schon ein int ist.
dann ntohl(laenge)
Nee, dass macht man auf den Rohdaten, wenn der Client in network order sendet.
-
Zitat:
teilstring char laenge
Aber er ist doch kein String sondern binaer.
Zitat:
mit atoi in einen int umgewandelt
Warum, wenn er doch schon ein int ist.
Zitat:
dann ntohl(laenge)
Nee, dass macht man auf den Rohdaten, wenn der Client in network order sendet.Weil ich ihn in einen buffer speichere(recv() funktion)
habt ihr auch Lösungsvorschläge? Jenseits von Richtig, Falsch oder ja und nein?
-
Lese die Zahl direkt binär aus:
int length; recv(hClient, &length, sizeof(int), 0); length = ntohl(length); // NICHT ntohs(), da du ja 4 Byte und nicht 2 swappen willst
Und dann den Rest mittels recv(..., length, ...) lesen.
-
prort schrieb:
habt ihr auch Lösungsvorschläge? Jenseits von Richtig, Falsch oder ja und nein?
#include <stdio.h> int main() { char gesendet[] = {0x0c, 0x00, 0x00, 0x00}; int *umgewandelt = (int*) gesendet; printf("%d", *umgewandelt); }