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!

user profile iconCyberaxx 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!

user profile iconCyberaxx 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!

user profile iconCyberaxx hat folgendes geschrieben:
Immerhin bekomm ich nun Daten

Damit sollte dieser Thread also gelöst sein; markierst du ihn noch entsprechend? Danke. :wink:

user profile iconCyberaxx 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:
user profile iconCyberaxx 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 user profile iconGausi: Absätze im Key hinzugefügt.