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

API, COM et SDKs Delphi Discussion :

Problème avec l'envoi d'une trame TCP


Sujet :

API, COM et SDKs Delphi

  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Problème avec l'envoi d'une trame TCP
    Salut,

    Mon appli doit transmettre une trame TCP/IP à une imprimante industrielle.
    Pour moi on ne se trouve pas dans le cas d'une config Client/Sever.
    Faut-il utiliser les objets Indy, si oui lesquels et comment et si non comment peut-on faire?

    Merci

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    D'abord tu dois absolument connaître le protocole utilisé par ton imprimante... Toi et nous pour pouvoir t'aider
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je suis d'accord, j'ai donc approfondi.

    On peut communiquer par FTP, j'ai essayé (exemple du faq : FTP client), j'arrive à me connceter mais pas envoyer le fichier texte.

    On peut communiquer en LPR, j'arrive à faire in PrintFile avec un TIdLPR qui m'imprime bien une étiquette. Mais je dois bloquer la com à un endroit car sur un deuxième essai j'ai 'Erreur socket#10048
    'Adresse déjà utilisé'
    ou une non exécution (temps d'attente trop long) ou un message avec erreur de socket #0.

    Désolé si c'est pas très clair mais je comprends pas tout.

    Merci

  4. #4
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Salut!
    Je possède un code Delphi super simple pour éxécuter une url. En gros, le principe que je te propose est le suivant : Si tu éxécutes un programme sur le poste du client qui irait voir de temps en temps si un certain fichier se trouve sur ton serveur (site perso par exemple), alors ce programme le télécharge dès qu'il le trouve et l'imprime... Qu'en penses-tu ? De ton côté, il suffira d'uploader le fichier en question avec un simple formulaire web. C'est la plus simple (peut-être pas la plus performante) des solutions que je possède. Voilà, si tu es intéressé, dis le moi, à+
    De retour parmis vous après 10 ans!!

  5. #5
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je suis bien entendu prenneur de toute solution.
    Mais mon objectif est de pouvoir tout réaliser dans une même application.

    Je continue à regarder pourquoi je ne peut pas faire de deuxième envoies.
    Tout en schant que pour librer la com je suis obliger d'arrêter Delphi et de le relancer (et ça n marche pas à chaque fois). Ce qui me laisse bien penser à une non fermeture de la communication sous forme de socket.

    Merci

  6. #6
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    tun ' as pas un extrait de code ?

  7. #7
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    Voici un code permettant d'effectuer le téléchargement d'un fichier et/ou d'éxécuter un script serveur (php) :
    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
    Uses UrlMon;
     
    {----------------------------------------------------------------}
    Procedure TForm1.Button1Click(Sender: TObject);
    Const
      url = 'http://sub0.developpez.com/index.htm';
      dst = 'c:\mapage.htm';
    Begin
      Try
        Try
          If (FileExists(dst)) Then DeleteFile(dst);
          URLDownloadToFile(Nil, url, dst, 0, Nil);
        Except ShowMessage('Erreur de téléchargement.');End;
      Finally
        If (FileExists(dst)) Then ShowMessage('Téléchargement effectué.');
      End;
    End;
    Donc l'idée en gros, c'est quand le programme va télécharger le fichier sur le disque, il l'imprime...

    Aussi, tu peux également utiliser une autre méthode :
    http://nono40.developpez.com/sources/source0015/

    En tous les cas, le fichier à imprimer doit être sur un serveur.
    Soit le serveur l'envoit au client (imprimante), soit le client le télécharge du serveur...
    Une fois que le fichier à imprimer est sur le disque du client, tu l'imprimes.
    De retour parmis vous après 10 ans!!

  8. #8
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'essai l'envoi par FTP.

    Par contre pour ce qui est de l'envoi par LPR, mon code est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    IdLpr1.Connect;
         if IdLpr1.Connected then
         begin
                IdLpr1.PrintFile('C:\MonFichier');
         end;
         IdLpr1.Disconnect;
    Avec IdLPR1 défini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     object IdLPR1: TIdLPR
        ASCIIFilter = True
        MaxLineAction = maException
        ReadTimeout = 0
        Host = '192.168.2.3'
        Port = 515
        Queue = 'pr1'
        Left = 642
        Top = 32
      end
    Le première envoi ce fait bien mais au deuxième envoi j'ai l'erreur :
    " Erreur de socket #10048 Adresse déjà utilisée"

    Je pense donc que c'est ma déconnection qui n'est pas bonne, mais j'ai esssayé plusieurs chose tel que destruction de la socket mais rien à faire.
    Il me faudrait donc un peut d'aide sur la fin de l'envoi du fichier par LPR.

    Merci

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Avec ton imprimante tu dois avoir des CD qui te permette d'installer les drivers reseaux.
    Il te suffit de les installer et de définir une imprimante générique texte qui utilise ces drivers et il te reste plus qu'a gérer cela simplement comme une impression standard d'un fichier texte.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Ce serait en effet plus facile de passer par une imprimante gérée par le PC mais je n'ai pas le droit compte tenu des contraintes de l'application.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    A tout hasard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IdLpr1.Connect := false
    au lieu de ???

  12. #12
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    L'instruction :
    n'est pas compilable 'la partie gauche n'est pas affectable'

    Il fallait tenter mais tanpis.

    Merci

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    T'as pas un Flush ou un truc comme ça pour vider les tampons de l'imprimante ?

    Ou alors, une solution dans ton code : tu crée et détruit l'objet TIdLpr au fur et à mesure de ton besoin (comme ça, ça détruit et réinitialise toutes les instances qui lui sont associées)

    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
    20
    21
    procedure TForm1.Imprimer(UnFichier:string);
    AIdLpr:TIdLPR;
    begin
      AIdLpr:=TIdLPR.Create(self);
      try
        with AIdLpr do
        begin
           ASCIIFilter:=True;
           MaxLineAction:= maException;
           ReadTimeout:= 0;
           Host:= '192.168.2.3';
           Port := 515;
           Queue := 'pr1';
          Connect;
          if Connected then PrintFile(Un Fichier);
          Disconnect;
        end;
      finally
         AIdLpr.Free;
      end;
    end;
    De plus : Il est possible que ton imprimante renvoie une info sur ton socket (si c'est du TCP) du style "Ca y'est, c'est fait, impression terminée", que le buffer d'arrivée de ton socket soit donc plein et qu'il t'interdise donc de le détruire jusqu'a ce que tu ais fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    recv(NumeroSocket, BufferArrayOfByte, (SizeOf(BufferArrayOfByte)), 0);
    ou alors, il faut fermer le socket en ayant pris soin, avec setsockopt de mettre le flag SO_LINGER, et un Timeout de 0.
    Comme ça, closesocket réussi toujours.
    Bidouilleuse Delphi

  14. #14
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    J'ai testé le code en créant et détuisant l'objet TIdLPR mais ça ne marche toujours pas.

    Pour le fait de vider le buffer , je suis en delphi 7 et apparament la fonction recv fait parti de WinSock qu'il faut éviter d'utiliser maintenant (je l'ai lu , je ne l'affirme pas).

    Merci

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    non, ne t'inqiete pas, recv fait aussi parti de Winsock2, d'une part;

    Ensuite et effectivement, tant que tu n'utilises pas un fichier comme celui de Alex Konshin (disponible sur www.torry.net) pour acceder aux API Winsock2, tu n'accède effectivement qu'aux API des Winsock v1.1. (Qui marchent quand même convenablement pour faire un recv).

    Quand tu as affaire avec du réseau, je ne vois pas pourquoi tu éviterais de passer par les Winsock si tu es sous Windows, puisque c'est ce qu'utilisent quasiment tous les logiciels sous Windows et que ça marche très bien (ni mieux, ni moins bien qu'autre chose : il ne faut pas écouter radio trottoir !).

    Pour info : je suis sous Delphi 7 et recv fonctionne très bien.
    Je pense que si tu veux t'en sortir, il va falloir que tu utilise cette fonction afin de vider le buffer de ton socket avant deconnection.
    Ca ne devrait pas représenter plus d'une dizaine de lignes de code, mais ces sur, même moi je ne m'en sent pas le courage... (il faut d'abord récupérer le numéro de socket, et là ça risque d'etre problématique)
    Bidouilleuse Delphi

Discussions similaires

  1. envoi d'une trame via rs232 avec SOH CR LF
    Par tibjedi dans le forum C
    Réponses: 4
    Dernier message: 24/04/2013, 14h06
  2. Envoi d'une trame TCP
    Par jchevalay54 dans le forum Débuter avec Java
    Réponses: 12
    Dernier message: 27/08/2012, 17h18
  3. [1.x] Problèmes avec l'envoi d'email depuis une task
    Par nsoinard dans le forum Symfony
    Réponses: 2
    Dernier message: 21/04/2010, 14h57
  4. Problèmes avec un TWebBrowser dans une DLL
    Par bellamyjc dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/01/2005, 22h35
  5. Problème avec un LIKE dans une procédure stockée
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 14h38

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