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

Lazarus Pascal Discussion :

[Mac] Indy + TCP foireux ? [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut [Mac] Indy + TCP foireux ?
    Bonjour,

    J'ai de gros problèmes avec Indy pour faire du TCP.
    J'utilise idTCPServer configuré comme ceci :
    - Port 4554
    - ListenQueue 15
    - MaxConnections 0
    - ReuseSocket en OSDependant
    - TerminateWait 5000

    Le client idTCPClient se connecte au server via le port 4554. Normal.

    Le client se connecte au server quand j'appuie sur un bouton. Et envoie 3 messages avant de se déconnecter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.Button3Click(Sender: TObject);
    begin
      IdTCPClient1.Host := Edit1.Text;
      IdTCPClient1.Connect;
      IdTCPClient1.IOHandler.WriteLn('TRANSFERTFILE');
      IdTCPClient1.IOHandler.WriteLn('dr.txt');
      IdTCPClient1.IOHandler.WriteLn('contenu');
      IdTCPClient1.Disconnect;
    end;
    Le server de son côté reçoit les messages dans l'ordre (en théorie). La réception se fait dans l'event OnExecute. Comme ça foirait, j'ai mis ce que je reçois dans un memo pour monitorer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    var
      Cmd : String;
    begin
      with AContext.Connection.IOHandler do
      begin
        Test := ReadLn;
        Cmd := Test;
     
        if Cmd = 'TRANSFERTFILE' then
        begin
          Test := ReadLn;
          Memo1.Lines.Add(Test);
          Test := ReadLn;
          Memo1.Lines.Add(Test);
        end;
      end;
      AContext.Connection.Disconnect;
    end;
    J'obtiens des résultats absolument illogiques. En local depuis Lazarus j'ai ça :
    dr.txt
    contenu
    dr.txt
    contenu
    En local sans passer par Lazarus j'ai ça :
    dr
    TRANSFERTFILE
    contenu
    dr.txt
    contenu
    Et en exécutant le server et le client sur des machines différentes c'est ça :
    TRANSFERTFILE
    dr.txt
    contenu
    dr.txt
    contenu
    C'est un peu du gros n'importe quoi ce que j'ai comme résultats... Pourtant j'ai sniffé un peu le réseau, et le client envoie bien l'info une seule fois. C'est le server qui réceptionne 2 fois les messages

    Ca fait une semaine que je me casse la tête avec ça... C'est un peu ma dernière chance de faire fonctionner cette chose.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Foireux ? Bien que je n'utilise plus Indy, c'est un qualificatif qui, malgré les nombreux usages de celui-ci, est rarement rencontré. Il faut bien une exception. Peut-être est-ce le cas ici. Sans aucunement préjuger de votre code, quand avec Indy le mien ne répondait pas au résultat souhaité, souvent la cause en était des "subtilités" et des mauvaises pratiques qui pourtant me semblaient logiques et "naturelles" d'autant qu'aucun message d'erreur n'agrémentait le résultat inattendu. Compliqué en plus, notamment -mais pas seulement- par la succession de versions (8,) 9 et 10 dont les fonctions et procédures ne sont pas toujours utilisables de la même façon d'une version à l'autre, bien que souvent elles conservent le même nom ou un nom très proche.

    Je ne sais pas si cela pourra vous aider mais John Colobri a fait des tutos sur Indy 9 et 10 (avec Delphi) et on trouve pas mal de docs sur les forums Delphi.

    Citation Envoyé par falcom4ever Voir le message
    [Mac] Indy+TCP
    Peut-être à vérifier aussi, la réelle compatibilité d'Indy avec Mac OS : il me reste un "soupçon". J'avais rencontré des problèmes d'installation aussi bien sous Win que Nux mais sur Mac OS X, ils sont demeurés insurmontables. Je suis content cependant d'apprendre que je m'y prenais mal : bien que n'ayant pas disposé du Mac longtemps (1 semaine), j'avais conclu trop rapidement que sous Lazarus, Indy 10 n'était pas "compatible".

    Citation Envoyé par falcom4ever Voir le message
    J'ai de gros problèmes avec Indy pour faire du TCP.
    Ca fait une semaine que je me casse la tête avec ça... C'est un peu ma dernière chance de faire fonctionner cette chose.
    Ce que j'ai retenu d'Indy, c'est que son utilisation rime avec patience et pugnacité . Faut aimer la bagarre !

    Cordialement. Gilles
    Dernière modification par Invité ; 14/02/2012 à 17h05. Motif: Orthographe

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    J'avoue que Indy peut-être assez complexe. Mais franchement, un truc plus simple que ce que je veux faire c'est pas possible >_<.

    Je veux juste envoyer 3 strings à la suite, et de les lire une seul fois dans l'ordre, je lui demande pas de me faire quelque chose de compliqué hein ^^''.

    Le tuto est quand même sympa, mais j'ai l'impression que limite ça me fait penser que Indy ne marche tout simplement pas sur Mac. Les résultats sont aberrants je trouve. Reste que Synapse qui tourne sur Mac, mais là j'avoue que j'ai rien capté à l'utilisation, ça a l'air galère aussi.

    Je sens que c'est pas demain que je vais faire du networking avec Lazarus....

    Pour installer sur Mac c'était un peu compliqué aussi, mais officiellement c'est "compatible".

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,
    Citation Envoyé par falcom4ever Voir le message
    Reste que Synapse qui tourne sur Mac, mais là j'avoue que j'ai rien capté à l'utilisation, ça a l'air galère aussi.
    Je vous ai transformé et simplifié rapidement une petite démo TCP "Synapse Delphi" en Lazarus. Je l'ai compilée en Win et Nux après les quelques modifications nécessaires.

    Si vous l'utilisez en Win, vous commenterez le cthreads :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    program TTCP;
     
    {$mode objfpc}{$H+}
     
    uses
      //cthreads, {A commenter en Win ou jouer avec les $IFDEF}
     
      Interfaces, // this includes the LCL widgetset
      Forms,
      mainU in 'mainU.pas' {Form1},
      TCPServer in 'TCPServer.pas',
      TCPClient in 'TCPClient.pas'; {Dans l'exemple original : vide}
     
    begin
      RequireDerivedFormResource := True;
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.
    et (toujours pour Win) dans les options du projet, options du compilateur, nom du fichier cible : TTCP.exe au lieu de TTCP.

    La principale modification est dans TCPServer. Il faut remplacer dans les uses la winsock par synsock
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses
        Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
        blcksock,
       {winsock valable que pour Win - A remplacer par SynSock}
        synsock ;
    Pour tester, j'ai utilisé Lazarus 0.9.31-FPC 2.6.1 dans les 2 environnements Win et Nux. La bibliothèque Synapse est incluse dans le projet contenu dans TTCP-Synapse.zip (que j'ai modifié à partir du projet Delphi contenu dans UDP_TCP_Example.zip) et les options du compilateur (pour le projet) sont renseignées. Pour Mac, à mon avis, il n'y a rien à changer.

    Lien ftp. Dernière précision : si Synapse fonctionne (paraît-il) sous Mac, la bibliothèque est normalement "only 32 bits" quelque soit l'environnement.

    Cordialement. Gilles
    Dernière modification par Invité ; 14/02/2012 à 20h24.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Merci Gilles,

    Avec Lazarus 0.9.30.2 et fpc 2.4.4, j'arrive à compiler.

    Par contre après j'arrive à rien faire avec le form. C'est comme si tout est disabled :S.

    C'est un peu bizarre, j'ai essayé de créer une nouvelle forme en la faisant pareil, mais le même problème.

    Je vais continuer à voir si j'arrive à faire marcher, merci pour l'exemple .
    Je vais essayer d'en tirer quelque chose quand même.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    A mon avis, recréez un projet. Dans son répertoire, copiez la librairie Synapse. Dans Projet --> options --> option du compilateur --> chemin, vous ajoutez le chemin relatif de la librairie (ie libsynapse) dans Autres fichiers unité (-Fu) et dans Librairies (-FI).

    Ceci fait, vous devriez essayer-plutôt que de refaire les Forms ou les Units- de copier dans le répertoire du projet les 4 fichiers mainU.lfm, mainU.pas, TCPClient.pas, TCPServer.pas...

    Ne pas oublier d'ajouter mainU après Forms, dans les uses du projet (Projet --> View Project Source).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    uses
      cthreads,
      Interfaces, // this includes the LCL widgetset
      Forms,
      mainU;
    Les 2 autres (TCPServer, TCPClient) sont inutiles à cet endroit du programme. Je suppose que le cthreads est nécessaire sous Mac.

    Si cela ne fonctionne pas, vous pourrez reconstruire la Form et les 2 units... Peut-être dans les uses y a-t-il quelque chose de différent (supplémentaire) sous Mac.

    Cordialement. Gilles

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2012
    Messages : 4
    Par défaut
    Bon décidément Mac c'est pas mon truc... J'abandonne de développer sur cet OS, je retourne à un bon vieux Windows. Même avec une vieille version de Delphi j'ai toujours réussi faire ce que je voulais :/.

    Sur Indy les paquets n'arrivent pas dans l'ordre, c'est un peu mauvais. Synapse même si ça peut marcher un peu mieux en théorie, ça à l'air un peu galère quand même.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Client TCp Indy Buffer de réception
    Par coax81 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 24/09/2008, 15h09
  2. Com TCP/IP Problème TClientSocket et Indy
    Par Tleconte dans le forum Web & réseau
    Réponses: 3
    Dernier message: 04/07/2008, 10h07
  3. [TCP] Client/Serveur avec les composants Indy
    Par bakaneko dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/02/2007, 12h47
  4. Réponses: 6
    Dernier message: 11/01/2005, 12h49
  5. Serveur TCP/IP Indy bloquant ?
    Par f6dqm1 dans le forum Web & réseau
    Réponses: 6
    Dernier message: 07/12/2004, 09h08

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