Socket et Selector

Socket et Selector - Ada - Programmation

Marsh Posté le 27-05-2006 à 16:29:44    

Bonjour
 
  Quelqu'un aurait déjà utilisé les sockets en Ada avec un Selector_Type? Pas moyen de trouver un exemple avec google.
 
Merci.

Reply

Marsh Posté le 27-05-2006 à 16:29:44   

Reply

Marsh Posté le 27-05-2006 à 16:56:37    

Woaw, ça change des "pourquoi j'arrive pas à affecter un string à un character"
 
Ben moi j'ai jamais utilisé Adasockets.
T'as regardé sur la page de samuel tardieu (le mec qui a fait le paquetage)
 
C'est quoi un Selector_Type ?
Un rapport avec le Select() en C ??

Reply

Marsh Posté le 27-05-2006 à 17:13:08    

;)  
 
En fait, j'utilise les gnat.sockets. C'est un mapping direct des fonctions c, et donc du select.
 
Nan, je n'ai pas été voir, mais je vais le faire de ce pas.

Reply

Marsh Posté le 29-05-2006 à 22:32:40    

J'ai réussi à utiliser les Selector_type de gnat.sockets.  :)

 

Si ça interesse quelqu'un, je poste un exemple.

 

Seb.

 

Reply

Marsh Posté le 31-05-2006 à 15:53:00    

Ca m'interesse alors post ;)
 
Au fait, pourquoi t'utilises Gnat.Socket ?
C'est pas mieux Adasockets ???
 
(Juste pour avoir ton avis)
 
Merci d'avance.
Seb aussi.

Reply

Marsh Posté le 01-06-2006 à 17:13:25    

Je remets le code au propre avec les commentaires qui vont bien et je poste.
 
Pourquoi Gnat.Sockets, ben tout simplement parce que livré en standard avec mon compilo. Et j'utilise ce package depuis un moment en mode multithreadé, j'ai donc des libs maison qui marchent très bien avec.
 
Ceci dit, je te retournerais la question, pourquoi utiliser Adasockets?

Reply

Marsh Posté le 02-06-2006 à 12:28:17    

Ben je crois que Adasocket est dans la bibliothèque standard Ada.
Et Gnat.Socket c'est spécifique au compilateur Gnat... donc pour la portabilité.

Reply

Marsh Posté le 02-06-2006 à 14:05:02    

Il n'y a aucune référence aux sockets dans le RM. Donc pas de librairies standard pour les sockets en Ada

Reply

Marsh Posté le 02-06-2006 à 19:49:56    

;) ouais c'est possible que je me sois avancé un peux là.
D'ailleurs ça serait pas très logique que ça y soit vu que c'est complètement spécifique de certaines machine et que Ada n'est fait uniquement pour programmer sur pc.
 
Bon ben oublis ce que je t'ai dis alors ;) et fais-nous du bon code avec Gnat.Socket

Reply

Marsh Posté le 04-06-2006 à 11:40:53    

apprentitux a écrit :

Woaw, ça change des "pourquoi j'arrive pas à affecter un string à un character"


 
+1, j'ai presque eu peur que l'ADA se limitait à l'utilisation de string en voyant les derniers posts :P

Reply

Marsh Posté le 04-06-2006 à 11:40:53   

Reply

Marsh Posté le 05-06-2006 à 16:58:03    

Voici un petit exemple avec un selector. C'est vraiment très limité, ce n'est pas ce qu'il y a de plus propre, mais ça illustre bien le fonctionnement.
 

Code :
  1. with GNAT.Sockets; use GNAT.Sockets;
  2. with Text_Io; use Text_Io;
  3. procedure Network is
  4.    Liste : array(1..10) of Socket_Type;
  5.    Bliste : array(1..10) of Boolean;
  6.    Reads,Write : Socket_Set_Type;
  7.    Selector : Selector_Type;
  8.    Srv_Adr,Adr : Sock_Addr_Type;
  9.    Srv_Socket : Socket_Type;
  10.    Status : Selector_Status;
  11.    package Intio is new Text_Io.Integer_Io(Integer);
  12.    Ptr : Integer := 0;
  13.    C : Character;
  14. begin
  15.    -- Initialisation de GNAT.Sockets
  16.    Initialize;
  17.    -- Creation de la socket serveur
  18.    Srv_Adr.Addr := Any_Inet_Addr;
  19.    Srv_Adr.Port := 3128;
  20.    Create_Socket(Srv_Socket);
  21.    Bind_Socket(Srv_Socket,Srv_Adr);
  22.    Listen_Socket(Srv_Socket);
  23.    -- Creation
  24.    Create_Selector(Selector);
  25.    Set(Write,Srv_Socket);
  26.    for I in 1..10 loop
  27.       Bliste(I) := False;
  28.    end loop;
  29.    loop
  30.       --Creation  des sets
  31.       Empty(Reads);
  32.       Set(Reads,Srv_Socket);
  33.       for I in 1..10 loop
  34.          if Bliste(I) then
  35.             Set(Reads,Liste(I));
  36.          end if;
  37.       end loop;
  38.       Check_Selector(Selector,Reads,Write,Status);
  39.       case Status is
  40.          when Completed =>
  41.             if Is_Set(Reads,Srv_Socket) then
  42.                Ptr := Ptr + 1;
  43.                Put_Line("Connexion : "&Integer'Image(Ptr));
  44.                Accept_Socket(Srv_Socket,Liste(Ptr),Adr);
  45.                Bliste(Ptr) := True;
  46.             else
  47.                for I in 1..10 loop
  48.                   if Bliste(I) then
  49.                      if Is_Set(Reads,Liste(I)) then
  50.                         Character'Read(Stream(Liste(I)),C);
  51.                         Put_line("socket "&Integer'Image(I)&Character'Image(C));
  52.                      end if;
  53.                   end if;
  54.                end loop;
  55.             end if;
  56.          when Expired =>
  57.             Put_Line("expired" );
  58.          when Aborted =>
  59.             Put_Line("aborted" );
  60.       end case;
  61.    end loop;
  62.    -- Destruction du selector
  63.    Close_Selector(Selector);
  64.    -- Finalisation pour le package GNAT.Sockets
  65.    Finalize;
  66. exception
  67.    when SOCKET_ERROR =>
  68.       Put_Line("SOCKET_ERROR" );
  69. end Network;

Reply

Marsh Posté le 20-12-2006 à 21:31:11    

Bonsoir, serait-il possible d'avoir une petite description en clair du role des selecteur et/ou de leur utilité ?
Merci d'avance

Reply

Marsh Posté le 23-12-2006 à 10:39:14    

Bonjour,  
 
J'ai une autre petite que stion à soumettre dans ce topic, a priori je ne peux pas initilaiser 2 sockets Ada sur le même port, comment fait-on pour servir pluseur client à la fois ? J'ai bien une idée, mais elle m'arange pas. est-ce que les selector peuvent me sortir d'affaire je connait du tout du tout, je n'ai pas compris l'exemple donné par Loki de placard,
 
edit : en fait je n'ai pas de solution du tout, c'est louche

Message cité 1 fois
Message édité par Profil supprimé le 23-12-2006 à 11:07:23
Reply

Marsh Posté le 28-12-2006 à 17:13:12    


 
Merci ... plus besoin.
 
 
 
La réponse est oui.

Reply

Marsh Posté le 04-01-2007 à 12:40:48    

Bonjour,
j'avance un peu dans ma decouverte des sockets et des selectors mais j'ai un problème de terminaison, à priori d'un serveur apres une connection.
Quelqu'un pourait-il me dire ce qu'il faut faire pour abandonner une connection  ? .. si la question est pertinante !

Reply

Marsh Posté le 05-01-2007 à 09:37:15    


 
La question ne fut peut-etre pas très pertinante ...
ceci dit, j'ai trouvé un solution ... j'envoi en local un permier message de fin au sereur, mais comme le seveur est planté sur le Check_Selector, j'envoie un second message de fin. Je m'en tire avec une levé d'exception Socket_Error en local, à priori pour bad selector bad file descriptor, bien qu'au debut de mes test je pensait à un broken pipe.  
 
Bonne journée.
 
edit :: je pense qu'il est possible de s'en sortir avec un seul message ... (dans certain cas)


Message édité par Profil supprimé le 05-01-2007 à 09:45:00
Reply

Marsh Posté le 10-01-2007 à 21:34:45    

Bonjour,
 
Comment proceder pour établir une connection full duplex ( avec Gnat.Sockets ) ?

Reply

Marsh Posté le 28-01-2008 à 08:01:16    

Yep, bonjour,
 
Je travaille à nouveau sur un système client/serveur et je viens de remarquer un truc correspondant à l'algo Loki du placard, ... c'est qu'il faut mettre un output côté client et un input côté serveur en premier, si non, ça ne fonctionne pas. A quoi cela tien ? je ne sais pas, je testerai plus tard.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed