9
votes

Server TCP non bloquant à l'aide de principes OTP

Je commence à apprendre Erlang, alors j'essaie d'écrire le "Bonjour, le monde!" de programmation simultanée, un bot IRC.

J'ai déjà écrit l'un à l'aide d'Erlang sans aucune des Nétiers OTP (superviseur, application, etc. Comportements). Je cherche à la réécrire à l'aide de principes OTP, mais malheureusement, je ne peux malheureusement pas comprendre le moyen "droit" de faire une programmation de socket avec OTP.

Il semble que le seul moyen raisonnable est de créer un autre processus manuellement et de le lier au superviseur, mais sûrement quelqu'un, quelque part, l'a déjà fait avant.


0 commentaires

3 Réponses :


4
votes

Je pense que c'est ce que vous recherchez: http://www.trapexit.org/building_a_non-blocking_tcp_server_utilisateur_otp_principles C'est un tutoriel complet sur la manière de construire un serveur TCP non bloquant à l'aide de OTP (bien sûr, est entièrement documenté et expliqué).


2 commentaires

Nope, utilise le sens sans papiers (et potentiellement instable) Prim_inet: async_accept / 2. Peut-être qu'il n'y a pas de "OTP Way" de faire ceci: /


Dans ce cas, je voudrais simplement utiliser GEN_TCP: Accepter / 1 et GEN_TCP: Controling_Process / 2 (Comme la documentation suggère: "Attribue un nouveau processus de contrôle PID PID à la prise. Le processus de contrôle est le processus qui reçoit des messages de la prise. Si appelé Par tout autre processus que le processus de contrôle actuel, {Erreur, EPERM} est renvoyé. "). Ceci est un exemple de comment utiliser ceci: 20bits.com/articles/erlang -A-Généralisée-TCP-Server (Notez le paragraphe suivant: "Le problème avec la mise en œuvre d'un serveur de réseau à l'aide de Gen_Server est que l'appel à GEN_TCP: Accepter ...". J'espère que cela vous aidera.



4
votes

Génial que vous avez commencé à apprendre Erlang / OTP!

Les ressources suivantes sont très utiles: p>

  • Le Principes de conception OTP . Lisez ceci avec soin, si vous ne l'avez pas déjà fait. Notez la mauvaise idée commune que OTP est orienté objet (OO): ce n'est pas! Oublie tout de "héritage". Il n'est pas possible de construire simplement des systèmes complets par "extension" modules standard. Li>
  • le Système de messagerie :

    Ces fonctions doivent être utilisées pour implémenter l'utilisation de messages système pour un processus P> blockQquote> li>

  • the processus spéciaux . Un processus spécial est un processus compatible OTP qui peut bien intégrer avec des superviseurs. Li> ul>

    Ceci est un code que j'ai dans mon projet. Je suis aussi un erlang apprenant aussi, alors ne faites pas trop confiance au code, s'il vous plaît. P>

    1> {ok, A} = gen_tcpserver:start_link({8080,[]},fun(Socket)->gen_tcp:close(Socket) end).
    {ok,<0.93.0>}
    2> sys:trace(A, true).
    ok
    *DBG* TCP event = {accepted,#Port<0.2102>}
    *DBG* TCP event = {accepted,#Port<0.2103>}
    3> 
    


1 commentaires

Au fait, à l'aide de ce processus OTP, le paramètre shutdown pour tout superviseur a du sens: il devrait être au moins supérieur à accepter_timeout .



2
votes

Une autre façon d'implémenter un auditeur TCP asynchrone consiste à utiliser superviseur_bridge .

Voici quelques codes que j'ai écrit pour montrer ceci (non testé): xxx

beaucoup plus facile à comprendre que mon autre réponse. Le connection_bridge peut être étendu pour prendre en charge UDP et SCTP.


0 commentaires