fonctionnement TIdTCPServer - Delphi/Pascal - Programmation
Marsh Posté le 24-11-2005 à 09:16:16
J'ai entendu dire qu'il fallait utiliser le port 49153 au minimum (pour une sombre histoire de déclaration pour les ports < 49153), mais je n'arrive toujours pas à recevoir l'événément de connexion sur mon serveur. De plus désormais le client m'indique "Erreur de socket #10067 : connexion refusée" ...
je comprend rien et pourtant... c simple ce que je veux faire à la base
Marsh Posté le 25-11-2005 à 16:53:19
Bon c'était à cause de la propriété "IdTCPServer.CommandHandlersEnabled" qui était = false... je comprend pas pourquoi ?! en passant à true tout rentre dans l'ordre mais en lisant l'aide je vois pas le rapport avec le message d'erreur qui indiqaut que le port et l'adresse était déjà utilisée.
Pour continuer mon monologue j'ai compris que si on surchage 'OnExecute' il faut mettre un "Sleep" dedans sous peine de bouffer tout le temps machine.
J'ai une autre erreur maintenant, quand je connecte mon client, je reçois un événément de connexion sur le serveur immédiatement suivi d'un événement de déconnexion ? du coup je n'arrive pas à récupérer du texte de mon client...
Par contre comprend toujours pas comment fonctionne les connexions, lorsque je déconnecte mon client, Le OnExecute correspondant sur le serveur est toujorus appelé tant que je met pas active à false. Que se passe-t-il ? il faut déconnecter des 2 côtés ? je pensais qu'il étais plus propre que ce soit le client qui se charge de la connexion et déconnexion ??
Marsh Posté le 21-11-2005 à 10:21:32
Bonjour,
J'aimerai coder une application serveur qui accepte des connexions TCP sur le port 1025.
J'ai donc utilisé un TIdTCPServer avec "DefaultPort" = 1025 et défini "Bindings" de telle sorte qu'il accepte toutes connexion sur le port 1025. Ensuite au runtime j'active/désactive le serveur sur le clique d'un bouton.
J'ai plusieurs problèmes et questions :
* Cette propriété "Bindings" est-elle indispensable ? je veux dire en indiquant "DefaultPort" à 1025 et en définissant aucun "Bindig" le serveur ne devrait-il écouter sur ce port et allouer automatiquement les sockets en utilisant ce port si besoin comme semble l'indiquer la doc Delphi : "TIdTCPServer uses the DefaultPort number to bind allocated sockets handles when the Active property to set to True." ?
* J'utilise un IdTCPClient avec la propriété "Port" = 1025 et je me connecte. En définissant l'événement "OnStatus" du client ainsi :
procedure TFormTCP1.IdTCPClientStatus(ASender: TObject;
const AStatus: TIdStatus; const AStatusText: String);
begin
MemoClient.Lines.Add( 'Status : "'+AStatusText+'"' );
end;
Je constate que mon client se connecte très bien....
par contre :
* Sur le serveur en définissant l'événément "OnConnect" ainsi :
procedure TFormTCP1.ConnectServer;
begin
MemoServeur.Lines.Add( 'Connexion => '+FIdPeerThread.Connection.Socket.Binding.PeerIP+':'+
IntToStr( FIdPeerThread.Connection.Socket.Binding.PeerPort ) );
end;
procedure TFormTCP1.IdTCPServerConnect(AThread: TIdPeerThread);
begin
FIdPeerThread:= AThread;
AThread.Synchronize( ConnectServer );
end;
Je ne constate aucune connexion (pourtant le client se connecte au localhost, sur lequel tourne également le serveur ?).
=> Pourtant il ne peut y avoir qu'un serveur TCP qui écoute sur un port donné je suppose donc où est le problème ?
=> D'ailleurs quand je relance mon programme pour la seconde fois j'ai une erreur "Impossible d'établir une liaison avec le socket. L'adresse et le port sont déjà utilisé." ?? Cela prouve ce qu'un seul serveur TCP peut écouter sur un port donné à un instant donné mais je ne comprend pas comment l'ancien serveur peut toujours écouter ? Peut-être aurais-je du forcer un "Active:= false" avant la terminaison du programme ? En même temps le composant devrait le faire automatiquement avant sa destruction non ?
Merci de m'éclairer car certains choses demeurent flou pour moi avec ces composants.