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

  1. #1
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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
    Nouveau Candidat au 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
    Points : 1
    Points
    1
    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.

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

    Désolé de ne pouvoir vous aider plus. Je n'ai pas eu le temps -ni l'envie d'ailleurs- de faire plus d'efforts que vous avec Mac. Naïvement, j'ai cru au départ que Mac OS X, proche cousin de Linux*, serait facile à utiliser en programmation avec Lazarus. J'ai rapidement déchanté. Je me sers tous les jours de Win et Nux avec Lazarus et c'est vraiment un plaisir... ce qui n'empêche pas les prises de tête. Si Mac OS n'était pas un choix "contraint" et que vous voulez essayer autre chose que Win, essayez Nux si vous ne connaissez pas. Avec Wubi par exemple, vous pouvez installer et désinstaller Ubuntu en un clin d'oeil à partir de votre Windows... Lazarus/FPC s'installe très bien... et fonctionne très bien (y compris Indy ... et Synapse).

    Cordialement. Gilles

    * si j'en crois les informations Web, MacOSX est un Unix basé sur un noyeau spécifique (Xnu) et utilisant principalement des packages BSD.
    Dernière modification par Invité ; 20/02/2012 à 09h04. Motif: Précisions

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Mars 2006
    Messages : 147
    Points : 84
    Points
    84
    Par défaut
    Bonjour,

    Pour avoir porté un projet complet de Delphi/Windows vers Lazarus/Mac, je peux confirmer avec fermeté que Indy ne fonctionne pas du tout sur MacOS.

    D'une manière générale, Lazarus n'est pas non plus un modèle de stabilité sur cette plateforme, mais reste utilisable, à condition d'oublier Indy.

    Synapse fonctionne très bien en effet. Ce n'est absolument pas galère, mais ça change évidemment les habitudes.

    André.

  10. #10
    Nouveau Candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour tout le monde,

    Je déterre ce sujet suite à quelques soucis avec Indy et Lazarus sur Windows.

    Le projet est tout simple, un client et un serveur qui échange simplement des chaines de caractères. Autrement dit rien de bien méchant.

    Mon souci se pose dans l'envoi de commande depuis le client. En effet, depuis un client tcp, j'arrive à me connecter mais lorsque j'envoie une commande le serveur tcp ne la reçoit pas et mon client tombe donc en TimeOut. Mais ce qu'il y a de plus étrange, c'est que le même code fonctionne parfaitement avec le serveur développer avec Delphi 2010.

    Si quelqu'un a une idée, je serais ravi de la partager.

    Merci d'avance.

    Popet


    Edit : Problème résolu. Il s'agissait de l'attribut Intercept du coté client qui était affecté alors que j'en utilisais pas du coté serveur

+ 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