Erlang - Ports

Dans Erlang, les ports sont utilisés pour la communication entre différents programmes. Un socket est un point de terminaison de communication qui permet aux machines de communiquer sur Internet en utilisant le protocole Internet (IP).

Types de protocoles utilisés dans les ports

Il existe 2 types de protocoles disponibles pour la communication. L'un est UDP et l'autre est TCP. UDP permet aux applications de s'envoyer des messages courts (appelés datagrammes), mais il n'y a aucune garantie de livraison pour ces messages. Ils peuvent également arriver dans le désordre. TCP, en revanche, fournit un flux fiable d'octets qui sont livrés dans l'ordre tant que la connexion est établie.

Regardons un exemple simple d'ouverture d'un port en utilisant UDP.

Exemple

-module(helloworld). 
-export([start/0]). 

start() -> 
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]).

Les choses suivantes doivent être notées à propos du programme ci-dessus

  • le gen_udp contient les modules d'Erlang utilisés pour la communication UDP.

  • Ici 8789 est le numéro de port qui est ouvert à Erlang. Vous devez vous assurer que ce numéro de port est disponible et peut être utilisé.

La sortie du programme ci-dessus est -

#Port<0.376>

Envoi d'un message sur le port

Une fois le port ouvert, un message peut être envoyé sur le port. Cela se fait via la méthode d'envoi. Regardons la syntaxe et l'exemple suivant.

Syntaxe

send(Socket, Address, Port, Packet)

Paramètres

  • Socket - Il s'agit du socket créé avec la commande gen_udp: open.

  • Address - Il s'agit de l'adresse de la machine à laquelle le message doit être envoyé.

  • port - Il s'agit du numéro de port sur lequel le message doit être envoyé.

  • Packet - Ce sont les détails du paquet ou du message qui doivent être envoyés.

Valeurs de retour

Un message ok est renvoyé si le message a été envoyé correctement.

Par exemple

-module(helloworld). 
-export([start/0]). 

start() ->
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send 
   (Socket,"localhost",8789,"Hello")]).

Production

La sortie du programme ci-dessus sera la suivante.

#Port<0.376>ok

Recevoir un message sur le port

Une fois le port ouvert, un message peut également être reçu sur le port. Cela se fait via lerecv method. Regardons la syntaxe et l'exemple suivant.

Syntaxe

recv(Socket, length)

Paramètres

  • Socket - Il s'agit du socket créé avec la commande gen_udp: open.

  • Length - C'est la longueur du message qui doit être reçu.

Valeurs de retour

Un message ok est renvoyé si le message a été envoyé correctement.

Par exemple

-module(helloworld). 
-export([start/0]). 

start() ->
   {ok, Socket} = gen_udp:open(8789), 
   io:fwrite("~p",[Socket]), 
   io:fwrite("~p",[gen_udp:send(Socket,"localhost",8789,"Hello")]),
   io:fwrite("~p",[gen_udp:recv(Socket, 20)]).

Le programme complet

Maintenant, évidemment, nous ne pouvons pas avoir le même message d'envoi et de réception dans le même programme. Vous devez les avoir définis dans différents programmes. Alors, créons le code suivant qui crée un composant serveur qui écoute les messages et un composant client qui envoie des messages.

Exemple

-module(helloworld). 
-export([start/0,client/1]). 

start() -> 
   spawn(fun() -> server(4000) end).

server(Port) ->
   {ok, Socket} = gen_udp:open(Port, [binary, {active, false}]), 
   io:format("server opened socket:~p~n",[Socket]), 
   loop(Socket). 

loop(Socket) ->
   inet:setopts(Socket, [{active, once}]), 
   receive 
      {udp, Socket, Host, Port, Bin} -> 
      io:format("server received:~p~n",[Bin]), 
      gen_udp:send(Socket, Host, Port, Bin), 
      loop(Socket) 
   end. 

client(N) -> 
   {ok, Socket} = gen_udp:open(0, [binary]), 
   io:format("client opened socket=~p~n",[Socket]), 
   ok = gen_udp:send(Socket, "localhost", 4000, N), Value = receive 
      {udp, Socket, _, _, Bin} ->
         io:format("client received:~p~n",[Bin]) after 2000 ->
      0 
   end, 
   
gen_udp:close(Socket), 
Value.

Les choses suivantes doivent être notées à propos du programme ci-dessus.

  • Nous définissons 2 fonctions, la première est serveur. Celui-ci servira à écouter sur le port 4000. Le second est le client qui servira à envoyer le message «Hello» au composant serveur.

  • La boucle de réception est utilisée pour lire les messages envoyés dans une boucle de définition.

Production

Vous devez maintenant exécuter le programme à partir de 2 fenêtres. La première fenêtre sera utilisée pour exécuter le composant serveur en exécutant le code suivant dans leerl command line window.

helloworld:start().

Cela affichera la sortie suivante dans la fenêtre de ligne de commande.

server opened socket:#Port<0.2314>

Maintenant, dans la deuxième fenêtre de ligne de commande erl, exécutez la commande suivante.

Helloworld:client(“<<Hello>>”).

Lorsque vous exécutez cette commande, la sortie suivante sera affichée dans la première fenêtre de ligne de commande.

server received:<<"Hello">>