Je commence à apprendre Erlang, alors j'essaie d'écrire le "Bonjour, le monde!" de programmation simultanée, un bot IRC. p>
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. p>
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. P>
3 Réponses :
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é). P>
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.
Génial que vous avez commencé à apprendre Erlang / OTP!
Les ressources suivantes sont très utiles: p>
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>
Au fait, à l'aide de ce processus OTP, le paramètre shutdown code> pour tout superviseur a du sens: il devrait être au moins supérieur à
accepter_timeout code>.
Une autre façon d'implémenter un auditeur TCP asynchrone consiste à utiliser superviseur_bridge code >
.
Voici quelques codes que j'ai écrit pour montrer ceci (non testé): p> beaucoup plus facile à comprendre que mon autre réponse. Le connection_bridge code> peut être étendu pour prendre en charge UDP et SCTP. P> p>