IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

[D7] fonctionnement TIdTCPServer ??


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut [D7] fonctionnement TIdTCPServer ??
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    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 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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 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.


    FRANK

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut
    UP !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut
    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

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut
    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.

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

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut
    j'ai fait des modifications... je me suis aperçu que sur le Disconnect il ne faut pas faire d'appel synchronisés (s'éxécutant dans la thread principale). Ce qui est bizarre c'est que quand je me deconnecte avec le client je n'ai pas d'événement de déconnexion sur le serveur... cet événement n'arrive que lorsque je désactive le serveur. De plus seul la première connexion client est déconnectée. Alors que de son côté le client semble se connecter et se déconnecter tout à fait normalement. Seuelemnt à chaque reconnexion du client (sans désactiver le serveur) le numéro du port augmente de un à chaque fois et quand je désactive le serveur seul le premier port utilisé pour les connexions semblent déconnecté ??

    Je ne comprend pas trop comment fonctionnent ces composants...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 149
    Par défaut
    Bon 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.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/06/2003, 16h51
  2. Réponses: 5
    Dernier message: 14/05/2003, 14h51
  3. [Turbo Pascal] TP7 fonctionne en QWERTY
    Par callahan dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 08/02/2003, 21h49
  4. Prb de fonctionnement dans SaveDialog avecInitialDir
    Par boyerf dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/12/2002, 21h46
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo