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 :

Probleme socket avec Indy sur Raspberry


Sujet :

Web & réseau Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 70
    Points : 46
    Points
    46
    Par défaut Probleme socket avec Indy sur Raspberry
    Bonjour,
    Sur mon Raspberry PI, j'ai un petit serveur très simple:
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      IdTcpServer.DefaultPort:= 5678;
      IdTcpServer.Active:= True;
    end;
     
    procedure TForm1.IdTCPServerConnect(AContext: TIdContext);
    begin
        AContext.Connection.IoHandler.WriteLn('Hello. Connecté au PI');
    end;
     
    procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
    begin
      IdTcpServer.Active:= True;
    end;
    Quand je lance le programme j'ai une erreur:
    Socket Error # 98
    Address already in use.

    Si je change le port 5678, pour autre chose, c'est toujours pareil!
    Je patine là.
    Merci

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    tu peux vérifier si le port est utilisé avec

    netstat -a | grep 5678
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    Le port est bien libre au lancement du programme.
    J'ai trouvé une solution remplacer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      IdTcpServer.DefaultPort:= 5678
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      IdTcpServer.Bindings.Add.Port := 5678;
    Maintenant cela marche, sauf que si le client se déconnecte, le serveur sur le Raspberry plante avec un message de SIGPIPE :-((((
    Grrrrr!!
    Michel

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 447
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 447
    Points : 24 844
    Points
    24 844
    Par défaut
    Même comportement "Address already in use" observé sur Indy (FTP qui hérite du TCP) sur windows, même approche par Bindings.Add() mais en plus avec une IP neutre '0.0.0.0', on a trouvé ça dans la Doc de mémoire

    Je suis totalement rouillé en Indy, j'en suis resté à la version 9 pour TCP Server avec des threads

    Mais Ceci est TRES etrange puisque le OnExecute se produit quand il y a des données et donc lorsque le serveur est déjà actif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
    begin
      IdTcpServer.Active:= True;
    end;
    Cela devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
    begin
      Truc := AContext.Connection.IOHandler.ReadLn;
      Machin := Traiter(Truc);
      AContext.Connection.IOHandler.WriteLn(Machin);
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    70
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 70
    Points : 46
    Points
    46
    Par défaut
    Oui c'était juste du test, voila le code actuel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.IdTCPServerExecute(AContext: TIdContext);
    begin
      if PremiereConnexion then
      begin
        PremiereConnexion:=false;
        AContext.Connection.IoHandler.WriteLn('Hello. Connecté au PI');
      end
      else
      begin
        AContext.Connection.IoHandler.WriteLn('La suite....');
      end;
    end;

  6. #6
    Débutant
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    886
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 886
    Points : 330
    Points
    330
    Par défaut
    as tu essayé à tout hasard, de ne pas passer par le code, mais directement depuis les propriétés du composant ? tu choisis le port, puis mets active à true

    ensuite es tu sûr que ton client est toujours connecté au serveur ? si ça se trouve, il se connecte et il perd aussitôt la connexion ? laisse le onConnect tranquille, après quelques seconde avec un bouton par ex, fait un test pour savoir si le client est toujours connecté

Discussions similaires

  1. Probleme impression avec CUPS sur redHat (police et marge trop importante)
    Par clemYokYok dans le forum RedHat / CentOS / Fedora
    Réponses: 0
    Dernier message: 20/04/2010, 11h51
  2. socket avec timeout sur accept
    Par Trunks dans le forum Windows
    Réponses: 8
    Dernier message: 29/01/2010, 16h21
  3. Programmer convenablement un serveur Socket avec Indy
    Par bruce-willis dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/07/2008, 14h17
  4. probleme update avec where sur requete imbriqué
    Par JulienCEA dans le forum Requêtes
    Réponses: 11
    Dernier message: 04/06/2008, 11h44
  5. Problème GD avec PNG sur Fedora 4 - quels paths ?
    Par romulus dans le forum Linux
    Réponses: 7
    Dernier message: 28/10/2005, 11h48

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