Winsock - Game-Server Emulator
-
Bei diesem Code:
char buf[1024]; rc = recv(client[i], buf, sizeof(buf), 0); buf[rc] = '\0'; printf("\n%d\n", rc); printf("\n%s\n", buf); printf("\n%d\n", buf[0]); printf("\n%d\n", buf[1]); printf("\n%d\n", buf[2]); printf("\n%d\n", buf[3]); printf("\n%d\n", buf[4]); printf("\n%d\n", buf[5]);war das der Output:
6 ♠ 6 0 98 102 4 38
-
ws2_32 schrieb:
Kann ich denn char buf[512]; benutzen, um diese Pakete von dem Spiel zu empfangen?
Ja, klar.
ws2_32 schrieb:
nur wo steckt jetzt die oftmals genannte Zahl 0x708 drinnen?...
Momentan habe ich über all dies überhaupt keinen Überblick
Einzelne Zeichen kannst du dir mit dem %c Operator anzeigen lassen:
#include <stdio.h> int main() { /* Mach dich doch mal schlau über ASCII Character Codes. Jedes Zeichen entspricht einer Nummer. Das Zeichen 'A' entsrpicht z.B. der Nummer 65 */ char c = 'A'; printf("Nummer: %d Zeichen: %c\n", c, c ); // Das ganze Funktioniert in beide Richtungen: c = 65; printf("Nummer: %d Zeichen: %c\n", c, c ); return 0; }Wo die Zahl 0x708 drin steckt ist schwer zu sagen, weil ich nicht weiss wie sie kodiert ist.
Eine Möglichkeit der Kodierung, bzw. Übertragung wäre:
char _16Bit[4] = "0708"; // 2 Byte
Das müsste man dann noch bei Bedarf in einen dezimalen Wert umrechnen.Mit switch( buf[i] ) kannst du immer nur ein Byte abfragen.
Entweder sind in deinem Puffer lauter Zahlen, dann sind halt je zwei Byte eine Zahl.
Sind noch andere Daten im Puffer, so müssen die Zahlen mit einem einleitenden Zeichen markiert sein, sonst findest du die nicht wieder.
-
Ich lade mir jetzt ein weiteres Spiel herunter und werde da mal gucken, was mir der Client schickt..
buf[0] und buf[1] sind dann die Header, oder?
bei dem nächsten Spiel kenne ich den Header nämlich, und dann vergleiche ich den halt mal mit den bekannten..
Momentan habe ich große Hoffnungen, dass ich es jetzt endlich geschafft habe...
Ich gebe dann Bescheid.
Vielen Dank für die bisherigen Bemühungen, ich hoffe, dass mir weitere Fragen, falls gleich welche enstehen, auch beantwortet werden

-
Keine Ahnung was du für Header meinst.
Bei einer HTTP Übertragung z.B. wird ein Header mit "\r\n\r\n" Beendet.Bedenke das in buf[0] und buf[1] jeweils nur ein Zeichen der Größe 1 Byte steckt.
Da es sich dabei um die ersten zwei Zeichen deines Puffer handelt, wird es sehr unwahrscheinlich sein, das es der Header ist.So wie ich es verstehe, möchtest du Gameserver abfragen.
Das ist keine ganz so einfache Sache, denn verschiedene Spiele können verschiedene Protokolle für die Übertragung benutzen.Du findest im Internet Informationen über diese Protokolle.
Es gibt auch Codeschnipsel und fertige Software(Gameserver-Scanner):
http://www.codeproject.com/managedcpp/gfxscan.asp
http://www.codeproject.com/csharp/GameServerInfo.asp
http://int64.org/
http://dev.kquery.com/
-
Scheiße!!!
Ich habe gerade solch ein riesen Post geschrieben. und dann kam ein Fehler beim "Absenden"!Recv-Func
SOCKET client[MAX_CLIENTS - 1]; char buf[1024]; rc = recv(client[i], buf, sizeof(buf), 0); buf[rc] = '<!--POST BOX-->'; ShowNotice("Client #%d [%s]: ", i, inet_ntoa(cinfo[i].sin_addr)); coprint(CL_WHITE, "%d\n\n", rc); for(i = 0; i < rc; i++) printf("\n%x %d %c\n", buf[i], buf[i], buf[i]);2. Spiele - Ragnarok / Rose
- Ragnarok
Wenn ich versuche mit einem Client zu meinem Server zu connecten (Login),
ist das das Paket, was ich bekomme:64 100 d
0 0
14 20 ¶
0 0
0 0
0 0
74 116 t
65 101 e
73 115 s
74 116 t
31 49 1
0 0
6a 106 j
0 0
0 0
0 0
68 104 h
74 116 t
0 0
31 49 1
31 49 1
31 49 1
31 49 1
31 49 1
31 49 1
31 49 1
0 0
0 0
0 0
0 0
74 116 t
65 101 e
73 115 s
74 116 t
32 50 2
0 0
0 0
0 0
68 104 h
0 0
32 50 2
32 50 2
32 50 2
32 50 2
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
0 0
12 18

Da ist auch alles drinnen:
[0] : 0x64
[1] : 0x00
ist der Header, und steht dafür, dass das das Login-Packet ist.
[2] ist die Client-Version
und dann folgt noch der Username, das Password und noch etwas.Es gibt bei RO auch das Error-Paket:
[0] = 0x6A
[1] = 0x00
[2] = ErrorCode 0-3
[3-23] = 0x00
wenn ich das schicken möchte:buf[0] = 0x6A; buf[1] = 0x00; buf[2] = 0x01; for(i = 3; i < 24; i++) buf[i] = 0x00; printf("\n\nNEW PACKET\n\n"); for(i = 0; i < 24; i++) printf("\n%x %d %c\n", buf[i], buf[i], buf[i]); send(client[i], buf, 24, 0);Kommt beim Client nichts an..
Muss ich für das schicken einen anderen Variablen-Typen nehmen, oder wie soll man das schicken?-
Rose
Das Login-Packet habe ich ja schon mal geschrieben.
Die Länge davon betrug 6, von dem RO Packet ist die Länge 55, da pass ja auch alles rein.
Aber bei dem Rose-Packet verstehe ich nicht wo da alles hinein soll, wie z.B. der Username/Password.
Kann es sein, dass Rose UDP oder anderes benutzt, und dadurch solche Verkrüppelungen auftauchen? -
weiß ich nun endlich, wo bei Ethereal, einem Packet-Sniffer, die Pakete stecken.
d.h. dass ich Ethereal benutzen kann, um auf die Pakete mit Paketen zu antworten..
Immerhin weiß ich es jetzt so ein bisschen ^^'
da sind nämlich so viele Dinge:
-Identification
-Checksum
-Header
-noch ein Checksum
da wusste ich gar nicht, was da jetzt eigentlich das Paket ist
Hmmm, da war noch eine Frage, aber die habe ich nun vergessen, ich werde sie, falls sie mir wieder einfällt, später stellen.
Ich hoffe, dass mir jemand weiter helfen kann

-
Wenn beim Client nichts ankommt, dann stimmt etwas mit der Verbindung nicht.

-
Hier schreibst du Werte in den Puffer:
buf[0] = 0x6A; buf[1] = 0x00; buf[2] = 0x01;Zwei Zeilen später überschreibst du den Puffer mit Nullen
for(i = 3; i < 24; i++) buf[i] = 0x00;
-
Ach quatsch i geht ja ab 3 los...das war zu voreilig...vergiss es wieder

-
Ist das mit dem:
send(client[i], buf, 24, 0);denn richtig?
send( empfangs-Socket , buf[0-1024] , Größe->also nur buf[0-23] , 0 )

-
Edit:
Noch einmal kurz eine Frage:
char buf[1024] ist ein char array,
mit Speicherplätzen von 0, 1, 2, 3, ..., 1023, 1024.
Also insgesamt 1025, will ich einen String darin speichern, geht einer für das Nullterminierungszeichen drauf, also 1025 - 1 = 1024.
Das muss aber auch nur so sein, wenn ich es als String ausgebe, z.B.:
printf("%s", buf);
Mache ich das aber nicht, also wenn ich einfach nur Zahlen von 0-255 oder chars darin speichere, habe ich 1025 Plätze.
Und wenn ich buf sende, z.B. so:
send(s, buf, 1025 oder sizeof(buf), 0);
dann brauche ich auch kein Nullterminierungszeichen.Stimmt das alles? .__.
-
ws2_32 schrieb:
Ist das mit dem:
send(client[i], buf, 24, 0);
denn richtig?
send( empfangs-Socket , buf[0-1024] , Größe->also nur buf[0-23] , 0 )

Ja, das ist ok. Es empfiehlt sich auch den Rückgabewert von send zu kontrollieren, ob auch alles gesendet wurde.
ws2_32 schrieb:
Edit:
Noch einmal kurz eine Frage:
char buf[1024] ist ein char array,
mit Speicherplätzen von 0, 1, 2, 3, ...1024 Speicherplätze der Größe 1 Byte mit dem Index von 0 bis einschließlich 1023.
Für einen String geht ein Speicherplatz für das '\0' Zeichen drauf, bleiben 1023 Speicherplätze für den String.
Senden kannst du natürlich 1024 Zeichen ohne das '\0'.Was mir noch aufgefallen war:
ws2_32 schrieb:
buf[0] = 0x6A
buf[1] = 0x00
buf[2] = 0x01;
for(i = 3; i < 24; i++)
buf[i] = 0x00;Tut auch die Zeile:
sprintf( buf, "%d %d %d", 0x6A, 0x00, 0x01 );

-
Schön guten Tag, ws2_32 wenn du wirklich interesse hast einen emulator zu Programieren, dann kannst du uns gerne helfen, wir Programmieren in C einen Emulator für Neocron.
Die Seite von uns ist, http://projekt-nc.deMFG Viper
-
<Error Detected>
char buf[1024]; // 1024 Bytes from Index 0 to 1023 !
<Error Detected>
buf[rc] = '<!--POST BOX-->'; // Error ! Konstant too Large !<There were some errors>