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

Autres IDE Pascal Discussion :

[WinSock] Problème d'affichage structure SERVENT [Virtual Pascal]


Sujet :

Autres IDE Pascal

  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut [WinSock] Problème d'affichage structure SERVENT
    Bonjour à toutes et tous !

    Dans un programme tout simple écrit en Virtual Pascal, j'énumère tous les ports et, pour chacun d'entre eux, j'affiche les informations disponibles sur le service correspondant.

    J'utilise pour cela la fonction GetServByPort, qui renvoie un pointeur vers une structure SERVENT :
    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
    Type tTabAlias = Array [0..255] of pChar; 
         pTabAlias = ^tTabAlias;
     
     
    Var pServData : pServEnt;                 
     
    ...
     
    Procedure AFFICHAGE_DONNEES_SERVICE (p : pServEnt);
    Var pAlias : pTabAlias;   (* Adresses des alias *)
        i : Byte;             (* Indice dans pAlias^ *)
    Begin
      WriteLn('Port n'#176' ',NtoHS(p^.s_Port));
      WriteLn('   Nom du service         : ',p^.s_Name);
      WriteLn('   Protocole de transport : ',p^.s_Proto);  <--- PLANTAGE !!!
      Write('   Alias                  : ');
      pAlias := pTabAlias(p^.s_Aliases);
      if pAlias^[0] <> Nil
         then
           begin
             WriteLn(pAlias^[0]);
             i := 1;
             while (i <= 255) and (pAlias^[i] <> Nil) do
               begin
                 WriteLn('                          : ',pAlias^[i]);
                 Inc(i);
               end;
           end
         else
           WriteLn;  
    End;    
     
    ...
     
    (* PROGRAMME PRINCIPAL *)
     
    ...
     
    for IntPort := 0 to 65535 do
      begin
        pServData := GetServByPort(HtoNS(IntPort),Nil);
        if pServData <> Nil
           then
             begin
               AFFICHAGE_DONNEES_SERVICE(pServData);
               ReadLn;
             end;  
      end;
    Voici la déclaration de la structure SERVENT dans la MSDN : http://msdn.microsoft.com/library/de.../servent_2.asp
    Voici sa déclaration dans l'unité WinSock de Virtual Pascal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PServEnt = ^TServEnt;
    TServEnt = packed record
      s_name: PChar;
      s_aliases: ^PChar;
      s_port: Smallint;
      s_proto: PChar;
    end;
    Presque tout fonctionne très bien : n° de port, nom du service, différents alias... sauf le nom du protocole de transport, dont l'adresse se trouve dans le champ s_Proto de la structure SERVENT.
    Lorsque j'essaye d'afficher ce nom, une violation d'accès se produit à tous les coups. Pourtant, je teste bien que le champ ne vaut pas NIL.

    Je ne trouve pas ce qui peut déclencher cette exception.
    Merci à celles et ceux qui voudront bien se pencher sur la question !

    P.S.1. Je pose ma question d'abord sur le forum Pascal car je crains qu'il s'agisse d'un problème spécifique à ma syntaxe.

    P.S.2. La syntaxe étendue est activée, l'erreur ne vient pas de là
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Il ne s'agirait pas d'un problème dans l'implémentation du type ServEnt dans virtual pascal ? Par exemple, une PChar qui ne se finit pas correctement
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Merci pour ta réponse !

    En fait, le type SERVENT possède un champ supplémentaire de type SmallInt, s_Pad1, entre s_Port et s_Proto ! Ce champ n'est pas documenté dans la MSDN ni dans ma volumineuse doc du SDK Win32...

    J'ai corrigé la déclaration du type dans la RTL et ai reporté le bug sur le site de Virtual Pascal. Ca marche à présent !
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

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

Discussions similaires

  1. [Vxi3] Problème mode affichage structure
    Par ahmed_amine dans le forum Deski
    Réponses: 1
    Dernier message: 14/07/2011, 16h57
  2. Problème affichage structure
    Par gégé140488 dans le forum Débuter
    Réponses: 2
    Dernier message: 18/11/2009, 18h55
  3. problème d'affichage avec les structures
    Par jlion5 dans le forum C
    Réponses: 1
    Dernier message: 03/05/2008, 13h13
  4. problème d'affichage suite a une structure
    Par clampin dans le forum Débuter
    Réponses: 4
    Dernier message: 26/12/2007, 18h00
  5. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20

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