Entwickler-Ecke
Internet / Netzwerk - ClientSocket empfängt keine Daten(Nachbau eines PHP Sockets)
Cyberaxx - Di 13.12.05 11:48
Titel: ClientSocket empfängt keine Daten(Nachbau eines PHP Sockets)
Hallo,
vorab muss ich sagen habe den Post bereits in einem anderen Forum gesetzt, war auch im IRC @QNet #Delphi.de, doch bisher fehlanzeige, drum versuch ichs hier auch noch einmal.
Habe Probleme mit einer ClientSocket Verbindung in Delphi. Ich versuche auf einen Chatserver eines Games zu connecten, per PHP klappt es auch soweit, nur wenn ich dann versuche mit dem Delphi Socket eine Verbindung aufzubauen, bekomme ich keine antwort vom Server.
Ich habe keine Ahnung warum ich keine Daten beziehen kann per Delphi, da es mit PHP klappt.
Quelltext
1: 2: 3:
| $result = socket_connect ($socket, $address, $service_port); $out = socket_read ($socket, 2048) Echo $out |
Das bekomm ich dann als Antwort
Quelltext
1: 2: 3: 4: 5:
| TCP/IP Verbindung SOCKET >> Resource id #2 >> OK. Versuche, eine Verbindung zu 'chat.dt.funcom.com' auf Port '7013' aufzubauen >> OK. Receive >> " f1d52ec909af0c55739af5e823b5ccc8 Socket schliessen >> OK. |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| procedure TForm1.btnClick(Sender: TObject); begin CSocket.Port := 7013; CSocket.Host := 'chat.dt.funcom.com'; CSocket.Open; end;
procedure TForm1.CSocketConnect(Sender: TObject; Socket: TCustomWinSocket); begin Log.Items.Add('[' + TimetoStr(now) + '] --> Connection established'); end;
procedure TForm1.CSocketConnection(Sender: TObject; Socket: TCustomWinSocket); begin Log.Items.Add('[' + TimetoStr(now) + '] --> Connection to ' + CSocket.Port); end;
procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket); begin Log.Items.Add('[' + TimetoStr(now) + '] --> Receive --> ' + CSocket.ReceieText'); end; |
Da kommt nun aber garnichts, eigentlich müsste er wie oben den Key schicken, oder versteh ich da was falsch? Wenn ich dagegen die Daten z.B. eines IRC-Servers eintrage bekomme ich Antwort.
Wäre nett wenn mir hier jemand helfen könnte.
Narses - Di 13.12.05 12:40
Moin!
Wenn ich mir deinen Quelltext ansehe, dann kommen mir da zwei Gedanken:
a) Du hast den Code hier ins Forum getippert -> bitte mal das Projekt als ZIP ohne die EXE hier als Anhang reinstellen, damit man mal sieht, was du da wirklich machst :wink:
b) Du hast c&p gemacht und überhaupt keine Ahnung, was du da tust... :?
Im Fall a) könnte man dir vielleicht helfen, im Fall b) hab ich keine Lust dazu. :D
cu
Narses
Cyberaxx - Di 13.12.05 12:59
Wenn Du meinst es ist Fall b) dann lass es halt.
Das was Du da als Quelltext siehst ist alles was da ist, mehr brauche ich nicht um beim connect vom Server(z.B. IRC-Server) die ersten Daten zu empfangen. Es geht ja erstmal nur darum warum ich grad beim connect den ersten Datensatz nicht bekomme, wie es eben im PHP der Fall ist.
Wenn ich die Daten meines IRC-Servers eintrage, bekomm ich beim connect wie üblich nen Datensatz.
Narses - Di 13.12.05 13:34
Moin!
Cyberaxx hat folgendes geschrieben: |
| Das was Du da als Quelltext siehst ist alles was da ist |
Naja, du verwendest den TClientSocket nicht ganz konzeptionell korrekt.
Ich kann leider meine Version (hier) nicht testen, aber ich habe den Quelltext mal etwas angepasst, wie ich mir das vorstellen würde. Probier´s doch mal aus und sag, was passiert (testen kann ich selber erst heute abend).
cu
Narses
Cyberaxx - Di 13.12.05 14:01
Selbiges Problem, es kommt nichts an.
Wie im ersten PHP Beispiel muss dort dieser "Code" vom server kommen ohne eine anfrage von mir.
Bisher reichte es bei mir immer mit .ReceiveText zu arbeiten, aber hier scheint echt nichts oder nur eine leere Zeile anzukommen. :(
Narses - Di 13.12.05 14:17
Moin!
Cyberaxx hat folgendes geschrieben: |
| Selbiges Problem, es kommt nichts an. |
Hmm, lass dir doch mal anzeigen, ob überhaupt was zurück kommt:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket); var Msg: String; begin Msg := Socket.ReceiveText; Log.Items.Add('[' + TimetoStr(now) + '] --> Receive[' + IntToStr(Lenght(Msg)) + '] --> ' + Msg); end; |
Und häng bitte mal den Inhalt des Memos nach einem Versuch an.
cu
Narses
Cyberaxx - Di 13.12.05 14:52
Quelltext
1: 2: 3:
| [13:45:59] --> Connecting to chat.dt.funcom.com [13:45:59] --> Connection established [13:45:59] --> Receive[38] --> |
ich war auch mal so frei und habe am ende der MSG noch Zeichen abgehanden
Delphi-Quelltext
1:
| Log.lines.Add('[' + TimetoStr(now) + '] --> Receive[' + IntToStr(Length(Msg)) + '] --> ' + Msg + '!!'); |
Jedoch erscheinen die beiden !! nicht....
Cyberaxx - Di 13.12.05 15:00
Ich weiss nicht ob das hier noch weiterhilft.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| $socket = socket_create(AF_INET, SOCK_STREAM, 0); $result = socket_connect ($socket, $address, $service_port); if ($result < 0) { echo "socket_connect() fehlgeschlagen.\nGrund: ($result) " . socket_strerror($result) . "\n"; } else { echo ">> OK.<br>"; } echo "Recive >> "; while ($out = socket_read ($socket, 2048)) { echo $out; } |
PHP ist nen absolutes Problem bei mir, mag ich einfach nicht wollen ;)
Das oben ist ein Auszug auf einem Beispiel basierend auf dem PHP-Bot.
Narses - Di 13.12.05 15:12
Moin!
Sieht aus, als käme da binäres Zeug zurück, mach das mal so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket); var Msg,MsgHex: String; begin Msg := Socket.ReceiveText; SetLength(MsgHex,2*Length(Msg)); BinToHex(@Msg[1],PChar(MsgHex),Length(MsgHex)); Log.Items.Add('[' + TimetoStr(now) + '] --> Receive[' + IntToStr(Length(Msg)) + '] --> ' + MsgHex); end; |
cu
Narses
Cyberaxx - Di 13.12.05 15:19
---------------------------
Benachrichtigung über Debugger-Problem
---------------------------
In Projekt C:\Programme\Borland\Delphi7\Projects\test\ChatConnect\Project1.exe trat ein Problem mit folgender Meldung auf: 'Zugriffsverletzung bei 0x00405929: Schreiben von Adresse 0x00030cd4'. Prozess angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Schlimmeres Ergebnis als vorher :D
Cyberaxx - Di 13.12.05 15:24
Wenn ich es Schritt für schritt nachgehe steht bei MSG.
Msg = #0#0#0''''#0'd65163fbdc9b8422abc2a39d51c83d55
Log.lines.Add('[' + TimetoStr(now) + '] --> Receive[' + IntToStr(Length(Msg)) + '] --> ' + MsgHex); <-- hier springt er dann raus.
Narses - Di 13.12.05 15:37
Moin!
Hmpf, diese doofen nullterminierten Strings... nächster Versuch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| procedure TForm1.CSocketRead(Sender: TObject; Socket: TCustomWinSocket); var Msg,MsgHex: String; begin Msg := Socket.ReceiveText; SetLength(MsgHex,2*Length(Msg)+1); BinToHex(@Msg[1],@MsgHex[1],Length(Msg)); SetLength(MsgHex,2*Length(Msg)); Log.Items.Add('[' + TimetoStr(now) + '] --> Receive[' + IntToStr(Length(Msg)) + '] --> ' + MsgHex); end; |
cu
Narses
Cyberaxx - Di 13.12.05 15:56
Quelltext
1: 2: 3:
| [14:43:20] --> Connecting to chat.dt.funcom.com [14:43:20] --> Connection established [14:43:20] --> Receive[38] --> 0000002200206164303432613066656266326630313234376465616238343161616331616235 |
Immerhin bekomm ich nun Daten, das Problem ist jetzt nur das dieser Datensatz nicht dem entspricht den ich vom PHP bekommen würde :(
Den Code den ich beim connecten bekomme(Login_Key) benötige ich um daraus dann einen neuen Key zu generieren, der aus diesem Key besteht, Benutzername und Passwort. Diesen muss ich dann an den Server zurück senden und zwar "Diffie-Hellman key exchange".
Es muss Doch eine Möglichkeit geben, das es mit Delphi nachzubauen ist...
Narses - Di 13.12.05 16:19
Moin!
Cyberaxx hat folgendes geschrieben: |
| Immerhin bekomm ich nun Daten |
Damit sollte dieser Thread also gelöst sein; markierst du ihn noch entsprechend? Danke. :wink:
Cyberaxx hat folgendes geschrieben: |
| das Problem ist jetzt nur das dieser Datensatz nicht dem entspricht den ich vom PHP bekommen würde :( |
Wenn du mit dem Protokoll, dass der Server fährt, nicht klar kommst, dann brauchst du zunächst mal eine möglichst exakte Doku des Protokolls.
Aber das ist ein anderes Problem, dein Client empfängt ja nun Daten. Neues Problem -> neuer Thread.
cu
Narses
Cyberaxx - Di 13.12.05 17:49
Der war gut....
Natürlich ist er nicht gelöst! das was er da empfängt ist kaudawelsch und definitiv nicht das was da normal da raus kommt.
Wie Du im erröffnungspost siehst müsste so etwas raus kommen.
Es hat mich also garnicht weiter gebracht auch wenn jetzt daten ankommen, ist nur die Exception die vorher kam gelöst aber nicht das problem ansich.
Titel: ClientSocket empfängt keine Daten(Nachbau eines PHP Sockets) <-- das was da kommt sind keine Daten die sich zum nachbau eignen, drum hab ich da etwas in klammern gesetzt... :(
Narses - Di 13.12.05 17:58
Moin!
Ich wiederhole mich gerne, aber begrenzt: Der ClientSocket empfängt Daten! Ob du einen PHP-Socket nachbauen möchtest, spielt IMHO an dieser Stelle keine Rolle, da der Haupttitel deines Threads auf den nicht erfolgten Datenempfang verweist. :wink:
Du kommst nun mit dem Protokoll des Servers nicht weiter ("kaudawelsch" :wink:), das hat nix mit dem Empfangen von Daten zu tun, sondern mit der Interpretation dieser. Ich habe mir die Forumsregeln nicht ausgedacht, aber diese besagen: Neue Frage -> neuer Thread.
cu
Narses
PS:
Cyberaxx hat folgendes geschrieben: |
| Es hat mich also garnicht weiter gebracht auch wenn jetzt daten ankommen |
Der ist gut... :| Ich hab ja nicht erwartet, dass du mir um den Hals fällst, aber das würde ich schon als "reichlich undankbar" bezeichnen... :shock:
Cyberaxx - Di 13.12.05 18:04
Das ist immernoch das selbe Problem. Mag sein das dort nicht steht interpretation von Daten. Es geht aber immernoch um den Nachbau des PHP-Sockets, denn dieseer, ist mit der lösung keinesfalls nachgebaut also Thread nicht gelöst.
Das Protokol entnehme ich aus dem PHP-Bot. Damit eine verbindung "wirklich" erfolgreicht ist, brauch ich den String oder was auch immer das ist haben. Erst darauf generiere ich den Schlüssel und nur diesen brauch ich erstmal zurück senden.
Quelltext
1:
| SOCKET --> Resource id #3[0][Received login seed, "c349cf6c25d7712ead46292144cd16ab"] |
Hier der Key den ich vom Server erhalte
Quelltext
1: 2: 3: 4: 5: 6:
| 1c4776451e4abcb931068bfe988f0865ff10532cf669cc0483b65525404dfda24da814f42 59a1fc12e1843c94d32331a0fdb5b2fc785fee22417ec394f5211f0gbeff9605ee24a7e16 19a9cfb7a0e931ce2ca06ace7310fe17b0d00fd81e24bc67abf95a11cbcbc9da747dca2g1 d9125a2d5bad572a62e058639abe10a8817ffad053d7b90b40ac105d3ac63386f2e802c6d e85c74f83091815589997a442db15f1d8cdf3d567881f28cf902724258623279890b0cfbe cbfcaa2ac49efecb1dc |
Die Antword, die der Server von mir haben will, generiert aus dem Server-Key und meinen Benutzerdaten.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| [7][List of characters on this account available:] online? Level Name CharNum 0 1 Area11 364536435 [5][You are logged in as Area11] [20][name lookup: 364536435 is "Area11"] [20][name lookup: 168362542 is "Irker"] [40][Buddy Status: Irker (is offline) (is on your friends list) ] [20][name lookup: 251765192 is "Pontox"] [40][Buddy Status: Pontox (is offline) (is on your friends list) ] [20][name lookup: 260793043 is "Lusie"] [40][Buddy Status: Lusie (is offline) (is on your friends list) ] [20][name lookup: 285234324 is "Kaheraathan"] [40][Buddy Status: Kaheraathan (is online) (is on your friends list) ] |
So schaut dann der eigentliche ablauf nach dem Connecten aus.
Moderiert von
Gausi: Absätze im Key hinzugefügt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!