Winsock - Game-Server Emulator
-
Es ist ja nett, dass ihr mir geantwortet habt, nur leider helfen mir diese kindischen Antworten in keinster Weise.
Ich hoffe, dass jemand mir mit konstruktiven Beiträgen helfen kann.
Falls ja, vielen Dank.

-
ws2_32 schrieb:
- Was genau sind Pakete?
Bei der Post:
Eine fest verpackte Postsendung der Deutschen Post oder anderen Anbietern mit einem bestimmten Mindest- bzw. Höchstgewicht.
Bei TCP/IP:
Daten die durchs Netzwerk geschickt werden.
Möglichwerweise in Pakete aufgeteilte Dateien, wenn sie nicht in ein Paket passen.ws2_32 schrieb:
Sind das auch Pakete, oder nur Strings?
Pakete mit Strings.

ws2_32 schrieb:
Oder muss das für ein Paket in Hexadezimal stehen?
Nö.
ws2_32 schrieb:
- Ich würde außerdem gerne wissen, wie ich eigentlich die Pakete scanne...
Ich benutze den Paket Sniffer "Ethereal".
Nur wenn ich da etwas aufnehme, weiß ich gar nicht, was ich jetzt zum identifizieren (s. switch() -> case 0x708:) der Pakete brauche..
Wozu scannen
Du hast doch einen Multi-Client-Server geschrieben(?),
die Pakete kommen i.A. über Sockets an, mit denen sich die Clients
zu deinem Server verbinden.
Du guckst also in den Puffer buf deiner recv Funktion rein und reagierst entsprechend in deinem Programm.
Musst also eigene Regeln aufstellen, was soll passieren, wenn dies und das drinsteht ( Anmeldung des Spielers, Name, Welches Spiel Starten, Socket-Nr. usw. ).ws2_32 schrieb:
- Wie kann ich Farben in printf benutzen, wie zum Beispiel:
#define CL_WHITE "\033[1;37m"Bei mir kommt da nichts, deswegen habe ich es momentan mit SetConsoleTextAttribute gemacht..
z.B.
system ("color 3c");MfG,
TCP/IP
-
Dieser Thread wurde von Moderator/in Tim aus dem Forum ANSI C in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Ok, erst einmal danke.
Nur die Frage, die ich noch habe, ist:
Wie genau empfange ich das?
Bei anderen Sourcen, die einen Server emulierten, gab es so etwas in der Art:
switch(buf) { case 0x708: break; }wie bekomme ich nun diesen Hex-Wert heraus, das 0x708?
Ich habe bisher so etwas:
char buf[512]; rc = recv(client[i], buf, sizeof(buf), 0); buf[rc] = '\0'; printf("\Client #%d: %s\n", i, buf);wenn ich mit dem Spiele-Client connecte, dann wird solch ein seltsames Pik ausgegeben..
Wie kann ich die Hex-Werte ausgeben, damit ich die die Anfragen der Clienten auch bestimmten Funktionen zuteilen kann?
[[[noch eine kleine Frage am Rande: wofür sind unsigned chars?]]]
-
Die Zahl 0x708 ist Hexadezimal und im Dezimalen ist es die 1800.
Für eine binäre Darstellung bräuchtest du 11 Bit.
char hat jedoch nur 1 Byte = 8 Bit.
Folge:
Die Zahl 0x708 muss auf zwei Byte verteilt werden.Die Anweisung switch(buf) ist syntaktisch falsch.
Wenn, dann müsste es switch(buf[i]) heissen.
Aus den oben genannten Gründen ist aber ein Vergleich auf buf[i] == 0x708
unsinnig.Das seltsame Pik dürfte das Steuerzeichen ACK sein. ( char c = 6 )
Was steht drin bei rc ?
Probier mal:
printf("\Client #%d: %s\n", rc, buf);Ansonsten musst du das Protokoll der Übertragung kennen, um zu wissen, wie du sinnvoll in deinem buf nach Daten suchen kannst.
-
Kann ich denn char buf[512]; benutzen, um diese Pakete von dem Spiel zu empfangen?
Oder muss ich int, long oder DWORD etc. benutzen?
rc beträgt beim empfang 6, so groß ist das Paket oder?
nur wo steckt jetzt die oftmals genannte Zahl 0x708 drinnen?...
Momentan habe ich über all dies überhaupt keinen Überblick

-
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>