Entwickler-Ecke

Internet / Netzwerk - TCP Server - Problem mit empfangen von Strings


Seraph - Mo 07.11.05 09:40
Titel: TCP Server - Problem mit empfangen von Strings
Hallo Leute!

Ich progge gerade eine TCPComunication zwischen zwei Programmen!

Geschichte:
Ich habe in C++ ein Programm geschrieben, wo TCPClient und TCPServer gegenseitig Strings übermitteln!
Jetzt ist es für mich günstiger, diese Methode in ein bestehendes DelphiProjekt einzubinden!

Ich habe jetzt schonmal einen stinknormalen IdTCPServer gebaut:

Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
  Memo1.Lines.Text := Memo1.Lines.Text + AThread.Connection.ReadString(255);
end;


Hierbei sende ich mit einem Client über den selben Port und selbstverständlich die richtige IP einen String an den Server, welcher diesen String in ein Memo übernehmen soll!

Jetzt das Problem:
Ich sende von einem anderen Computer aus den String ab.
Der String wird aber erst in der MemoBox ausgegeben, wenn ich den String 3x abgesendet habe!
Der Server schreibt ihn aber dann nicht nur einmal, sondern auch wieder dreimal in das Memo.

Frage:
Kann es etwas mit der ConstByte angabe zutun haben, die bei der ReadString-Funktion verlangt wird! Wenn ja, wie bekomme ich die Länge des ankommenden Strings heraus? :gruebel:

Danke im Voraus und Grüße
Seraph


Seraph - Mo 07.11.05 11:49

Vergesst das Oben!
Das hat mir eh keinen Wert mehr!

Neues Problem:
Ich suche schon das ganze Internet nach einer ClientRead Methode ab!
Da kommen dann immer diese Chat-Beispiele und so.
Damit der Client etwas empfängt wenden alle die Methode "idTCPClient.ReadLn;" an.
Wenn ich das mache, hängt sich der Client auf. Aber schon Vollgas!

Meine Frage ist nun:
Kann ich herausfinden (wirklich nur prüfen), ob der Client überhaupt etwas empfängt?

Danke euch im Voraus
Seraph


BattleFrog - Di 08.11.05 16:07

Der Client empfängt nix ohne das eine Read Funktion aufgerufen wurde.
Erst dann schickt der Server etwas los.

Daher kann man nicht wissen ob da Daten sind, bevor man die Daten gelesen hat.


Seraph - Di 08.11.05 16:17

user profile iconBattleFrog hat folgendes geschrieben:
Der Client empfängt nix ohne das eine Read Funktion


Wenn ich eine onRead Funktion mache, hängt sich der client voll auf!
Der Client komuniziert nämlich mit einem Server, der in C++ programmiert wurde!
Und der handelt anders! Jetzt hab ich wohl das Problem, dass der Server sich nix abverlangen lässt! Der schickt nämlich nix, wenn jemand was anfordert!

Ich hab sogar schon Examples connecten lassen! Vergeblich. Hängen sich alle auf!

Grüße
Seraph


BattleFrog - Di 08.11.05 16:33

Kommt denn eine Fehlermeldung oder reagieren die Clients garnicht mehr?

Zeig doch mal bitte den C++ Teil der den String zum Client raushaut.


Seraph - Fr 11.11.05 16:24
Titel: Hier der Quellcode des Servers:
user profile iconBattleFrog hat folgendes geschrieben:
Zeig doch mal bitte den C++ Teil der den String zum Client raushaut.


C#-Quelltext
1:
2:
Server->Socket->Connections[0]->SendText("Keystring");
                              //0, da nur ein Client vorhanden sein kann ist


jakobwenzel - Fr 11.11.05 16:31

Mach das ReadLn in einem Timer.OnTimer, mit dem Parameter 5, denn so wartet der Client maximal 5ms auf eine Antowert. Dann prüf erst, ob im String was drinsteht.


Seraph - Fr 11.11.05 17:05

user profile iconjakobwenzel hat folgendes geschrieben:
Mach das ReadLn in einem Timer.


Selbst wenn ich beim OnFormCreate sage, dass er Readen soll, hängt er sich auf! Da wäre ein Timer ja der Vollabschuss!

Sorry, aber ich glaube, dass C++-Indy's nicht mit Delphi-Indy's kommunizieren können. Ich hab schonmal einen in Delphi programmierten Beispielchat ausprobiert! Hab client gemacht! IP und Port alles korrekt eingestell.
Da nahm sich der Rechner nen Strick...den Rest kann man sich denken! :?


jakobwenzel - Fr 11.11.05 20:01

user profile iconjakobwenzel hat folgendes geschrieben:
[...] mit dem Parameter 5, denn so wartet der Client maximal 5ms auf eine Antowert. Dann prüf erst, ob im String was drinsteht.

Wie ich schon schrieb: Du machst es mit dem Parameter 5 (also xy.ReadLn(5);), sodass der Client maximal 5ms wartet, bis etwas gesendet wurde. Danach musst du halt prüfen, ob in dem String was drinsteht.


crt - Fr 11.11.05 23:16

Bedeutet ReadLn nicht, dass der alles bis zum nächsten Zeilenumbruch empfängt?
Einen Zeilenumbruch sendest du nämlich gar nicht...
Das würde auch das Aufhängen erklären - der wartet vergeblich auf sein #10#13...


BattleFrog - Mo 14.11.05 11:25

Ja da fehlt einfach ein Timeout im CLient, oder ein Zeilenumbruch vom Server.


Seraph - Mi 16.11.05 13:32

Ja, es lag an dem Zeilenumbruch!
Danke Leute!

Grüße
Seraph