winsock => Binärstring übertragen
-
Hallo Leute,
ich habe folgendes Problem:
Ich will mit Winsock einen Binärstring übertragen, um Informationen eines Servers abzufragen. Dazu habe ich einen PHP-Code gefunden, der zuerst einen Binärstring an den Server sendet.
In PHP sieht der Binärstring so aus:$querycommand = pack("CCCV", 0xFE, 0xFD, 0x00, 0x7E).pack("CCC", 0xFF, 0xFF, 0xFF);Ich schreibe das nur, weil es auch sein kann, dass ich den PHP-Befehl pack falsch verstanden habe.
Jedenfalls steht ein C für einen char (8 Bit) und ein V für einen long (32 Bit)
Ich habe daraus in C++ ein Array von 10 chars gemacht und die einzelnen Bytes manuell selbst gesetzt.
unsigned char buffer[10]; buffer[0] = 0xFE; buffer[1] = 0xFD; buffer[2] = 0x00; buffer[3] = 0x7E; buffer[4] = 0x00; buffer[5] = 0x00; buffer[6] = 0x00; buffer[7] = 0xFF; buffer[8] = 0xFF; buffer[9] = 0xFF;unsigned musste ich nehmen, weil sich sonst der Kompiler beschwert hat, dass 0xFF zu groß für einen normalen char ist.
Wenn ich das ganze gez aber über send versenden will, muss ich das ganze ja wieder in einen char* umwandeln (mit nem cast hab ich das gemacht)...
Und ich bekomme nur Müll vom Server zurück. Kann es sein, dass durch das casten Informationen verloren gehen? Oder hab ich bei dem Befehl "pack" was falsch interpretiert?
Wäre nett, wenn mir jemand helfen könnte

SALOMON
-
wenn du nach char * einen cast machst, bekommst du eine zeichenkette, die bei \0 einen abschluss findet.
damit kriegst du als ausgabe bei deinem bufferinhalt nur die ersten zwei zeichen. das dritte (0x00) beendet die ausgabe.
könnte es das sein?
-
Ja daran habe ich auch schon gedacht, aber ich gebe der send methode ja mit, dass ich 10 bytes übertragen will. Daher denke ich, dass send auch den ganzen Puffer übertragt.
Außerdem würde mir jetzt spontan auch nichts einfallen, wie ich die 0x00 umgehen könnte....
-
wie rufst du send denn auf? es muss so aussehen:
send(s, (const char*)&buffer[0], 10, 0)
dann wirds gehen
-
SkriptProfessor schrieb:
es muss so aussehen:
send(s, (const char*)&buffer[0], 10, 0)lol, warum nicht einfach:
send(s, (const char*)buffer, 10, 0)
-
statt 10 besser sizeof(buffer).
-
CodeFinder schrieb:
SkriptProfessor schrieb:
es muss so aussehen:
send(s, (const char*)&buffer[0], 10, 0)lol, warum nicht einfach:
send(s, (const char*)buffer, 10, 0)
das ist doch vollkommen egal, mensch

-
So sieht meine send-Funktion aus: (ich verwende sendto, weil es sich um eine UDP-Verbindung handelt...)
sendto(aao_connection, (const char*)buffer, sizeof(buffer), 0, (const sockaddr*)&addr, sizeof(sockaddr_in));
-
ich habs mal in php ausprobiert, der string ist viel länger als 10 zeichen.
-
doch nicht. sorry!!!!!
die ausgabe ist
FE FD 00 7E 00 00 00 FF FF FF
-
udp soll ja bekanntlich nicht sonderlich zuverlässig sein, aber
wahrscheinlich machst du beim empfangen der daten etwas falsch
-
Es gibt garkeine UDP Verbindungen...

-
ninkimono schrieb:
CodeFinder schrieb:
SkriptProfessor schrieb:
es muss so aussehen:
send(s, (const char*)&buffer[0], 10, 0)lol, warum nicht einfach:
send(s, (const char*)buffer, 10, 0)
das ist doch vollkommen egal, mensch

Jo, und doppelt gemoppelt hält auch besser :p ...