TIdTCPServer réouverture de connexion impossible

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Derniè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 ?

[;)] David, à VERSAILLES
http://www.gentag.fr

5 réponses

Utilisateur anonyme
19 avril 2006 à 18:49
Salut David,



Il y a un truc qui me gène :



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;



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.



Ton application plante :

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;



Tu crois pas qu'il y a un petit soucis içi en cas de reconnection ??





A+
3
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
19 avril 2006 à 20:41
Bonjour Francky2 (et des poussières, hi),

En effet, si j'enlève ces lignes (que je ne sais plus ou j'ai chopées) ça ne plante plus.
C'est cool mais j'aurais aimé savoir pourquoi !

En effet, je ne voyait pas le mal de faire un nettoyage et de rerenseigner le PC qui se connecte.

[;)] David, à VERSAILLES
0
Utilisateur anonyme
19 avril 2006 à 21:30
Salut



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;



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



Tu crois pas qu'il y a un petit conflit entre les 2 procédures ??



A+
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
20 avril 2006 à 00:21
Salut,



Bon déjà,

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;



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

----------------------------------------------------------------------------

Troisièmement soit logique dans ton code :



rocedure TfrmMain.tcpSMainConnect(AThread: TIdPeerThread);

begin

tcpSMain.Bindings.Clear;

tcpSMain.Bindings.Add.IP := AThread.Connection.Socket.Binding.PeerIP;

mmoMain.Lines.Add('Connecté au '+AThread.Connection.Socket.Binding.PeerIP);



mmo : c quoi? Ton code ressemble à rien, désolé.

-------------------------------------------------------------------------------

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

-----------------------------------------------------------------------------



Allez désespère pas : lol



A+
0
Rejoignez-nous