новости сообщество форум вики
Erlang по-русски. Форум » Erlang »

gen_server & gen_tcp

(5 posts)

  1. Доброго времени суток!
    Начал осваивать Erlang :)
    и ре?ил попробовать написать простенький tcp сервер.
    Не совсем понятно как прилепить listen socket к gen_server'у!
    в функции init/1 я создам сокет
    Socket = gen_tcp:listen(?PORT, {active, true}}
    и верну его в состоянии. это все понятно.
    но где делается accept?

    Подскажите плиз :)

    Отправлено 7 мес. назад #
  2. Красиво и в полном соответствии с OTP это не делается. Для чего так сделано - не знаю.
    Надо стартовать один или несколько отдельных процессов (не по OTP), в которых вызвать gen_tcp:accept(Socket). Эта функция вернет клиенский сокет после подключения к нему кого-либо. ? вот уже с этим сокетом можно запустить новый gen_server для обмена данными, либо отдать их обратно в тот gen_server, из которого создавались accept-процессы.

    Есть еще недокументированный способ - через модуль prim_inet. Он позволяет сделать асинхронное оповещение об accept, которое хоро?о встраивается в gen_server. Но все-таки это не официальный способ.. и по идее может быть прикрыт в следующих релизах erts.

    Отправлено 7 мес. назад #
  3. Можно сделать принимающий gen_server с gen_tcp:accept(Socket, Timeout). Но это корявенький подход.

    Отправлено 7 мес. назад #
  4. Кстати, потом в самом процессе - приемнике данных из сокета тоже правильнее делать синхронный вызов recv, т.к. только в этом случае удастся управлять потоком (приостанавливать прием если не успеваем обработать данные).
    А из-за этого такой процесс тоже будет сделан не на OTP.

    В общем, OTP и сокеты не особо дружат между собой.

    Отправлено 7 мес. назад #
  5. Можно {active, once} выставлять.

    Отправлено 7 мес. назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.

 
 

так же

Популярные тэги



Currently online

No Members around.

twitter