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

Ada Discussion :

Migration d'un serveur uni-client vers multi-clients


Sujet :

Ada

  1. #1
    Invité
    Invité(e)
    Par défaut Migration d'un serveur uni-client vers multi-clients
    Bonjour,
    je suis en train d'ecrire un petit programme pour faire ses comptes (rien d'exceptionnel) qui permet d'envoyer les comptes à un serveur (que je suis en train d'écrire également) et qui renvoie la moyenne des dépenses par rubrique.
    J'ai donc écrit un serveur uni-client en utilisant Gnat.Sockets, et je viens de découvrir (mais c'est beaucoup dire) le rôle des sélecteurs de GNat.Sockets qui, semblerait-il, me permettrait de servir plusieurs clients simultanément.

    Donc, j'ai cet exemple ::=
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
     
    with GNAT.Sockets; use GNAT.Sockets;
    with Text_Io; use Text_Io;
     
    procedure Network is
       Liste : array(1..10) of Socket_Type;
       Bliste : array(1..10) of Boolean;
       Reads,Write : Socket_Set_Type;
     
       Selector : Selector_Type;
       Srv_Adr,Adr : Sock_Addr_Type;
       Srv_Socket : Socket_Type;
       Status : Selector_Status;
       package Intio is new Text_Io.Integer_Io(Integer);
       Ptr : Integer := 0;
       C : Character;
    begin
     
       -- Initialisation de GNAT.Sockets
       Initialize;
     
       -- Creation de la socket serveur
       Srv_Adr.Addr := Any_Inet_Addr;
       Srv_Adr.Port := 3128;
       Create_Socket(Srv_Socket);
       Bind_Socket(Srv_Socket,Srv_Adr);
       Listen_Socket(Srv_Socket);
     
       -- Creation
       Create_Selector(Selector);
       Set(Write,Srv_Socket);
     
       for I in 1..10 loop
          Bliste(I) := False;
       end loop;
     
       loop
          --Creation  des sets
          Empty(Reads);
          Set(Reads,Srv_Socket);
          for I in 1..10 loop
             if Bliste(I) then
                Set(Reads,Liste(I));
             end if;
          end loop;
     
          Check_Selector(Selector,Reads,Write,Status);
     
          case Status is
             when Completed =>
     
                if Is_Set(Reads,Srv_Socket) then
                   Ptr := Ptr + 1;
                   Put_Line("Connexion : "&Integer'Image(Ptr));
                   Accept_Socket(Srv_Socket,Liste(Ptr),Adr);
                   Bliste(Ptr) := True;
                else
                   for I in 1..10 loop
                      if Bliste(I) then
                         if Is_Set(Reads,Liste(I)) then
                            Character'Read(Stream(Liste(I)),C);
                            Put_line("socket "&Integer'Image(I)&Character'Image(C));
                         end if;
                      end if;
                   end loop;
                end if;
     
             when Expired =>
                Put_Line("expired");
     
             when Aborted =>
                Put_Line("aborted");
     
          end case;
     
       end loop;
     
       -- Destruction du selector
       Close_Selector(Selector);
       -- Finalisation pour le package GNAT.Sockets
       Finalize;
     
    exception
       when SOCKET_ERROR =>
          Put_Line("SOCKET_ERROR");
    end Network;
    et j'ai le code de mon serveur ::= Fmi-server-0.0.4-alpha.tgz
    Ecrit pour Gnu/Linux et utilisant Gnat, Gnat.Sockets

    Et j'ai du mal à les intégrer car je ne comprends rien à l'exemple.

    Si quelqu'un pouvait faire le boulot à ma place .... je plaisante ..... si quelqu'un avait le courage de jeter un oeil à mon serveur et de m'aider à y voir plus clair.

    Ce matin j'ai fait ça Fmi-server-0.0.4-beta.tgz mais évidemment, ça ne fonctionne pas du tout, du tout.

    Merci
    Dernière modification par Alcatîz ; 30/12/2006 à 11h28.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je ne comprend deja pas comment, dans un traitement sequentiel, il est posible d'opérer plusieurs traitements simultannés ? Si toute fois c'est ce que fait ce programme Network ? Car c'est bien ce que je lui demande ... à moin de fair une erreur d'analyse ??

    Merci pour vos reponses.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Pour le moment je n'ai fait que remetre l'element Bliste à false apres initialisation de l'element de Pong_LIste, et ça à l'air de tourner, mais je suis toujours dans le doute quant à la simulanéité du traitement. Je ferais des tests multi-clients demain, ce qui me donnera le fin-mot de l'histoire.

    J'espere que ce n'est tout de même pas la fin du sujet, car j'espere pouvoir vous faire profiter de cette expérience.
    Dernière modification par Invité ; 29/12/2006 à 15h27. Motif: faute de frappe

  4. #4
    Invité
    Invité(e)
    Par défaut
    Je manque parfois de présence d'esprit, bref, j'ai deja fait mes tests et ça à l'air de fonctionner. Merci à seb de lille pour son exemple.

  5. #5
    Invité
    Invité(e)
    Par défaut Un serveur avec un client intégré qui plante au logout
    Bonjour, je poursuit mon architecture client/serveur et j'ai un problème de Storage_Error levée à la terminaison de thread_server.

    SI ça dis à quelqu'un de jeter un coup d'oeuil à ce code, je reste à disposition pour données toutes informations supplementaires nécessaires à la conpréhension de ce projet Linux. Les supports Gnat.Socket et Gnat.Md5 sont necessaires.

    les sources http://denimes.net/des_prog/Reseau/server.tgz

    j'ai placé quelques informations de debugage mais ça ne donne rien.

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jovalise
    Bonjour, je poursuit mon architecture client/serveur et j'ai un problème de Storage_Error levée à la terminaison de thread_server.

    SI ça dis à quelqu'un de jeter un coup d'oeuil à ce code, je reste à disposition pour données toutes informations supplementaires nécessaires à la conpréhension de ce projet Linux. Les supports Gnat.Socket et Gnat.Md5 sont necessaires.

    les sources http://denimes.net/des_prog/Reseau/server.tgz

    j'ai placé quelques informations de debugage mais ça ne donne rien.

    Merci
    J'ai déplacé l'appel à Init dans le Thread_server est ça marche, mais bon, je charge le fichier autant de fois qu'il y a de login+inscription, c'est un peu génant.

  7. #7
    Invité
    Invité(e)
    Par défaut Explicite Storage_Error when SIGSEG
    Bonjour,

    je retravaille sur un serveur, et j'ai un problème, je suis limité à deux clients ... au troisièmes, le second Is_Set (gnat.sockets) provoque la levée d'un Storage_Error explicite dans System.Interrupt_Managment pour cause de signal Posix SIGSEGV et je suis bien embêté.

    Mon code : (le type Socket_Access est un accès à Socket_Type)
    Code ada : 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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
     
       task type T_Thread_server(Socket : Socket_Access) is
          entry Get_Id(Id : out Task_Id);
       end T_Thread_server;
       type Thread_server_Access is access T_Thread_server;
     
       task body Server is
     
          type T_Thread_Server_Task is
             record
                Id : Task_Id := Null_Task_id;
                thread_server : thread_server_access;
             end record;
          type thread_server_Task_Access is access T_Thread_Server_Task;
     
          procedure Unchecked_Deallocation_thread_server is
             new Ada.Unchecked_Deallocation(T_Thread_Server,thread_server_Access);
          procedure Unchecked_Deallocation_thread_server_task is
             new Ada.Unchecked_Deallocation(T_Thread_Server_Task,thread_server_Task_Access);
     
     
          Max : constant Positive := 2;
     
          Liste : array(1..max) of Socket_access;
          Liste_Thread_task : array(1..max) of Thread_Server_Task_Access;
          Bliste : array(1..max) of Boolean;
          Reads,Write : Socket_Set_Type;
     
          Selector : Selector_Type;
          Srv_Adr,Adr : Sock_Addr_Type;
          Srv_Socket : Socket_Type;
          Status : Selector_Status;
     
          Ptr : Integer := 0;
     
          function Chercher return Natural is
          begin
             for I in 1..max loop
                if Liste_Thread_Task(I) = null then
                   return I;
                elsif Is_Callable(Liste_Thread_Task(I).Id) then
                   null;
                elsif Is_Terminated(Liste_Thread_Task(I).Id) then
                   Unchecked_Deallocation_Thread_Server(Liste_Thread_Task(I).Thread_Server);
                   Unchecked_Deallocation_Thread_Server_task(Liste_Thread_Task(I));
                   Close_Socket(Liste(I).all);
                   return I;
                end if;
             end loop;
             return 0;
          end Chercher;
     
          thread_Suivant : Natural := 0;
     
       begin
          for I in 1..max loop
             liste(I) := new Socket_Type;
          end loop;
     
     
          Bliste := (others => False);
     
          Initialize;
          Srv_Adr.Addr := Any_Inet_Addr;
          Srv_Adr.Port := 5877;
          Create_Socket(Srv_Socket);
          Bind_Socket(Srv_Socket,Srv_Adr);
          Listen_Socket(Srv_Socket);
          Create_Selector(Selector);
          Set(Write,Srv_Socket);
     
          loop
             Put_Line("1");
             Empty(Reads);
             Put_Line("2");
             Set(Reads,Srv_Socket);
             Put_Line("3");
             for I in 1..max loop
                if Bliste(I) then
                   Set(Reads,Liste(I).all);
                end if;
             end loop;
             Put_Line("4");
             Check_Selector(Selector,Reads,Write,Status);
             Put_Line("5, ");
             case Status is
                when Completed =>
     
                   if Is_Set(Reads,Srv_Socket) then
                      Thread_Suivant := Chercher;
                      Put("6, ");
                      if Thread_Suivant /= 0 then
                         Ptr := Thread_Suivant;
                         Put("7");
                         Accept_Socket(Srv_Socket,Liste(Ptr).all,Adr);
                         Put_line("8");
                         Bliste(Ptr) := True;
                      end if;
                   else
     
                      for I in 1..max loop
     
                         Put_Line("9");
                         if bliste(I) then
                         if Is_Set(Reads,Liste(I).all) then
                            Put_Line("10");
                            Liste_Thread_Task(I) := new T_Thread_Server_Task;
                            Put_Line("11");
                            Liste_Thread_Task(I).thread_server := new T_Thread_Server(Liste(i));
                            Put_Line("12");
                            Liste_Thread_Task(i).thread_server.Get_Id(Liste_Thread_Task(i).Id);
                            Put_Line("13");
                            Bliste(i) := false;
                            Put_Line("14");
                         end if;
                         end if;
                         delay 1.0;
                      end loop;
                   end if;
                when Expired =>
                   Put_Line("expired");
                when Aborted =>
                   Put_Line("aborted");
             end case;
             exit when End_Of_program;
          end loop;
     
       end Server;

    Merci pour vos question et réponses.
    Dernière modification par Invité ; 22/01/2008 à 08h06.

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

    Alors, j'ai trouvé, ... ilmanquait un contrôle de la bliste avant le Is_Set en question, ... je corrige le code ci-dessus.

    Merci

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

Discussions similaires

  1. [MySQL] Site Backoffice avec multi client et multi base SQL
    Par lmabire dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/01/2012, 09h06
  2. PCHelpWare multi clients et multi serveurs
    Par othmane126 dans le forum Windows
    Réponses: 2
    Dernier message: 29/01/2009, 13h16
  3. comment transférer un fichier d'un serveur ftp unix vers un client ftp dos ?
    Par chercheur3 dans le forum Serveurs (Apache, IIS,...)
    Réponses: 2
    Dernier message: 21/06/2007, 10h47
  4. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 17h13

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