cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 2011
-
19 avril 2006 à 15:32
Utilisateur anonyme -
20 avril 2006 à 00:21
Bonjour à tous,
J'ai une connection TCP/IP indy avec TIdTCPServer et client.
Sur le serveur, je lance mon application: OK
Sur le client je lance mon application: OK
J'envoie quelques données: OK
Sur le client je déconnecte la communication: OK
Sur le client, je veux la relancer: Impossible !
Je veux fermer le programme coté Serveur: Violation d'adresse
Sur le serveur, il rentre dans l'evenement Disconnect() une fois que le client a déconnecté et ne veut plus faire de connect ensuite.
Voici mon code coté client:
<!-- BEGIN TEMPLATE: bbcode_code -->
procedure TfrmMain.ouvrirTCP;
begin
fermerTCP;
tcpCMain.Host := txtIp.Text;
tcpCMain.Port := numPort;
try
tcpCMain.Connect;
except
SetInfo('Impossible d''ouvrir le port TCP');
end;
end;
end;
procedure TfrmMain.envoyerTCP(ligne: String);
begin
if (tcpCMain.Connected) then
tcpCMain.Write(ligne);
end;
procedure TfrmMain.fermerTCP();
begin
if (tcpCMain.Connected) then
tcpCMain.Disconnect;
end;
<!-- END TEMPLATE: bbcode_code -->Et coté Serveur:
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
procedure TfrmMain.tcpSMainConnect(AThread: TIdPeerThread);
begin
mmoMain.Lines.Add('Connecté au '+AThread.Connection.Socket.Binding.PeerIP);
tcpSMain.Bindings.Clear;
tcpSMain.Bindings.Add.IP := AThread.Connection.Socket.Binding.PeerIP; // IP de l'autre PC
end;
procedure TfrmMain.tcpSMainExecute(AThread: TIdPeerThread);
var
Line: String;
begin
While AThread.Connection.Connected do begin
Line := AThread.Connection.Readln;
mmoMain.Lines.Add(Line);
end;
end;
procedure TfrmMain.tcpSMainDisconnect(AThread: TIdPeerThread);
begin
mmoMain.Lines.Add('Déconnecté');
end;
<!-- END TEMPLATE: bbcode_code -->
Qu'est ce qu'il se passe ?
Tu n'utilises pas Try Except Finally (Pareil coté client). Tu as
de la chances tu transmets des strings (encore que ca peut planter).
Fait cela avec des fichiers et là ca va planter à tout les coups.
Deuxièmement apprend à fermet ton serveur (pas de soucis pour les
strings normalement mais pour des fichiers c'est quasi-obligatoire).
Ton beug vient certainement du fait que tu n'utilises pas Try Except finally correctement.
cs_nitrique
Messages postés344Date d'inscriptionjeudi 1 mai 2003StatutMembreDernière intervention 4 avril 20111 19 avril 2006 à 22:31
Hummm,
Allez, je me lance... (c'est ma premiere communication TCP, tu l'auras deviné).
Tout juste qu'il vient de se connecter qu'on réinnitialise la connexion, nan ?
Connected et Connect ne se marchent pas sur les pieds.
Connect c'est l'évenement et Connected c'est l'état, donc je ne vois pas le conflit qu'il peut y avoir entre les deux.
[;)] David, à VERSAILLES
Vous n’avez pas trouvé la réponse que vous recherchez ?
Ce qui est souligné est inutile : si ton serveur est pas connecté
comment veux tu qu'il soit sur écoute et comment veux tu que la
procedure Execute ai lieu ??
Deuxièmement, renomme tes composants Correctement : on ne sait pas qui
est le serveur et qui est le client : la seule distinction est un
rikiki petit "S".
Quatrièmement : avant d'utiliser une source choppée quelque part apprend à la comprendre. Ca veut dire quoi ca ?? (je te laisse chercher)) :
tcpSMain.Bindings.Add.IP := AThread.Connection.Socket.Binding.PeerIP;
Et compare la synthaxe ci-dessus avec :
procedure TfrmMain.ouvrirTCP; //j'ai épuré c normal
begin
fermerTCP;
tcpCMain.Host := txtIp.Text;
tcpCMain.Port := numPort;
tcpCMain.Connect;
end;
Ca serait pas l'histoire du chien qui se mort la queue ??