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 :

message d'erreur du serveur lors d'une déconnexion brutale avec Indy


Sujet :

Web & réseau Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut message d'erreur du serveur lors d'une déconnexion brutale avec Indy
    Bonjour à tous,

    Je commence en Delphi, j'utilise la version 7 (pro).
    Je fais communiquer mon application en Delphi avec une machine. Les 2 discutent en TCP.
    - création du serveur TCP : aucun problème.
    - communication entre la machine et l'appli : ok (via OnExecute)

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    type TComm = Class
      {Evènements de l'objet serveur TCP ("serveur")}
        procedure ServeurTCP_OnConnect(AThread : TIdPeerThread);
        procedure ServeurTCP_OnExecute(AThread : TIdPeerThread);
        procedure ServeurTCP_OnDisconnect(AThread : TIdPeerThread);
      private
        serveur :     TIdTCPServer;
        liaison_mtl_serveur:    TIdTcpServerConnection;
        connexion_mtl_serveur : boolean;{indicateur de l'état de la connexion}
    ...
    end;
     
    procedure TComm.ServeurTCP_OnExecute (AThread : TIdPeerThread);
    var
      data : string;
    begin
      with AThread.Connection do
      try
        try
          liaison_mtl_serveur := AThread.Connection;
          data := AThread.Connection.CurrentReadBuffer();
          if data <> '' then
          begin
            donnees_mtl := data;
            flag_data := true;
          end;
        except
          //Notification d'une erreur au client
          on E : Exception do
          WriteLn(Format('ERROR : %s',[e.Message]));
        end;
      except
         Disconnect; //Fermeture de la connexion
      end;
    end;
    c'est surement très moche et il doit y avoir des trucs inutiles,
    mais lorsque je déconnecte ma machine, j'ai une grosse série d'erreurs :
    Violation d'accès à l'adresse XXXX tentative de lire à l'adresse 000000
    la "déconnexion" est assez brutale : via une fonction (MTL) Lorsque je commente tout le contenu de ma procédure 'OnExecute', je n'ai plus d'erreur. Je ne trouve pas d'où vient mon erreur.

    Voyez vous d'où peut venir le problème svp ?

    au cas ou, je link mes évènements 'OnConnect' et 'OnDisconnect'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TComm.ServeurTCP_OnConnect (AThread : TIdPeerThread);
    begin
      {reset de la connection si elle existe}
      if liaison_mtl_serveur <> nil then
      begin
        connexion_mtl_serveur := false;
        liaison_mtl_serveur := nil;
      end; {if}
      liaison_mtl_serveur := AThread.Connection; {connexion}
      if liaison_mtl_serveur.Connected then
        connexion_mtl_serveur := true;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TComm.ServeurTCP_OnDisconnect(aThread : TIdPeerThread);
    begin
      liaison_mtl_serveur := nil;
    end;
    PS : le tout est au sein d'une classe sans graphique dédiée à la communication.
    En cas de besoin, je peux link toute ma classe.

  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
    il y a manifestement un pointer nul dans ton code

    est-ce que "AThread.Connection" peux être nul par hasard ?
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    Bonjour Paul TOTH,

    Merci de ta réponse.

    Violation d'accès à l'adresse 0046FC97 dans le module 'truc.exe'. Lecture de l'adresse 00000000.
    Si je comprend bien ta remarque, c'est un pointeur (à l'adresse 0046FC97) qui essaie de lire à l'adresse "00000000" (d'où "nul"). En ce qui concerne AThread.connection, je suppose qu'il peut-être nul, mais je ne maîtrise pas du tout le thread généré par le serveur TCP/IP.

    Je ne connais pas bien Delphi, donc je peux me tromper, mais le fait d'avoir intégré mon "AThreat.connection" dans un try/except ne force-t'il pas, en cas d'erreur, à lever une exception avec un message du type : WriteLn(Format('ERROR : %s',[e.Message])); ?
    (ou "MessageDlg('FAIL to read!', mtError, [mbOK], 0 );" ) comme je viens de rajouter.

    Il se trouve que malgré tout, j'ai toujours la même erreur.
    Je vais donc continuer à chercher. (un autre pointeur ?)

    Bonne journée

    EDIT : visiblement, il s'agit de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    data := AThread.Connection.CurrentReadBuffer();
    qui pose problème. mais même si je fais un test sur AThread.Connection, j'ai toujours la même erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if AThread.Connection <> nil then
      data := AThread.Connection.CurrentReadBuffer();
    Je repose donc ma question autrement :

    comment vérifier que je peux lire dans le AThread.Connection.CurrentReadBuffer() sans engendrer de message d'erreur ?

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2010
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 12
    Points : 11
    Points
    11
    Par défaut
    J'ai trouvé :
    Lors de la création de mon objet TComm, je déclarais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    serveur := TIdTCPServer.Create(AOwner);
    liaison_mtl_serveur := TIdTcpServerConnection.create(serveur)
    cette dernière ligne faisait une double création avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liaison_mtl_serveur := AThread.Connection;
    de la procédure évènementielle OnConnect.

    les threads n'étaient pas bien libérés et pointaient ... sur nul...

    Maintenant, le programme à la forme :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    constructor TComm.Create(AOwner : TComponent );  // AOwner : TComponent
    begin
    {Création des objets "serveur" et "liaison_mtl_serveur"}
      serveur := TIdTCPServer.Create(AOwner);
    {Affectation des procédures aux évènements correspondants}
      serveur.OnConnect := ServeurTCP_OnConnect;
      serveur.OnExecute := ServeurTCP_OnExecute;
      serveur.OnDisconnect := ServeurTCP_OnDisconnect;
    {Définition des valeurs par défaut du serveur}
      ip_mtl := '127.0.0.1'; {carte réseau locale pour la réception des données MTL}
      portTCP_mtl := 10004;  {port de lecture}
      connexion_mtl_serveur := false;
    end;
     
    procedure TComm.ServeurTCP_OnConnect (AThread : TIdPeerThread);
    begin
      if not Assigned(liaison_mtl_serveur) then
      begin
        liaison_mtl_serveur := AThread.Connection; {connexion}
        if liaison_mtl_serveur.Connected then
          connexion_mtl_serveur := true;
      end; { if }
    end;
     
    procedure TComm.ServeurTCP_OnDisconnect(aThread : TIdPeerThread);
    begin
      AThread.Stop;
      connexion_mtl_serveur := False;
      FreeAndNil(liaison_mtl_serveur);
    end;
     
    procedure TComm.ServeurTCP_OnExecute (AThread : TIdPeerThread);
    var
      data : string;
    begin
      if Assigned(liaison_mtl_serveur) then
      begin
        with liaison_mtl_serveur do
        begin
          if not AThread.Terminated then
          begin
            data := liaison_mtl_serveur.CurrentReadBuffer();
            if data <> '' then
            begin
              donnees_mtl := data;
              flag_data := true;
            end;{if}
          end;
        end; { with }
      end; { if }
    end;
    GRRRR voilà pourquoi il ne faut pas faire n'importe quoi avec des threads !

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

Discussions similaires

  1. Message d'erreur en php lors d'une ouverture d'une session
    Par emmanuelmaigne dans le forum Langage
    Réponses: 3
    Dernier message: 22/03/2011, 11h31
  2. Message d'erreur DB ERROR lors d'une mise à jour
    Par Rony Rauzduel dans le forum Administration
    Réponses: 4
    Dernier message: 03/03/2010, 22h09
  3. Réponses: 15
    Dernier message: 05/10/2009, 09h41
  4. Réponses: 15
    Dernier message: 05/10/2009, 09h41
  5. Réponses: 4
    Dernier message: 23/08/2006, 14h15

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