<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Сервер с 3мя открытыми портами и select()</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html</link>
    <description>Hello, big bro..&lt;br&gt;Есть проблема..&lt;br&gt;Делаю сервер с 3 портами, работающими каждый независимо друг от друга...&lt;br&gt;Использую неблокируюшие сокеты + select. Возникает следующая проблема - после добавления слушающих сокетов в множество селект прекрасно разбирает входящие соединения и разруливает их, нок  примеру если мне необходимо принимать данные от нескольких клиентов (одновременно), после вызова accept только первый клиент посылает данные (на примере эхо-сервера и телнета проверил), а остальные хоть и подключаются, но при вводе строк не получают ответа.. Как только первый клиент отрубается, начинают работать остальные... Как поправить, где пропустил чего?&lt;br&gt;--&lt;br&gt;функция принимает 3 порта, функция makeServerSocket принимает порт и возвращает дискриптор слушающего сокета (в ней выполняются последовательно socket, bind, listen).&lt;br&gt;В этой функции также включен nonblocking mode через fcntl.&lt;br&gt;Спс :)&lt;br&gt;P.S. всякие kqueue, epoll и пр. не предлагать плиз взамен этому. Ибо геморрно и разбираться надо :( fork тоже не катит, как</description>

<item>
    <title>Сервер с 3мя открытыми портами и select() (socket_select_nonblock)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#11</link>
    <pubDate>Thu, 17 Sep 2009 09:51:26 GMT</pubDate>
    <description>&amp;gt;Выложи плиз :), интересно стало. &lt;br&gt;&lt;br&gt;Держи, не жалко. Думаю, разберешься что куда...&lt;br&gt;Это не итоговая версия - здесь много сообщений для отслеживания ошибок..&lt;br&gt;&lt;br&gt;int startServer(int emulator_port, int controller_port, int system_port) &lt;br&gt;&#123;&lt;br&gt;int emu_sock=0, contr_sock=0, sys_sock=0;&lt;br&gt;int emu_fd, contr_fd, sys_fd;&lt;br&gt;int epfd=0;&lt;br&gt;struct sockaddr_in my_addr,emu_addr,contr_addr,sys_addr;&lt;br&gt;int res=0,res1=0,res2=0;&lt;br&gt;int i=0;&lt;br&gt;int new_fd,kdpfd,ret;&lt;br&gt;static struct epoll_event ev;&lt;br&gt;static struct epoll_event events&#091;EPOLL_QUEUE_LEN&#093;; /*When no size, error - Bad address*/&lt;br&gt;int len=sizeof(struct sockaddr_in);&lt;br&gt;int curfds,nfds;&lt;br&gt;int n;&lt;br&gt;&lt;br&gt;if((emu_sock=makeServerSocket(emulator_port))==-1)&lt;br&gt;&#123;&lt;br&gt;perror(&quot;error emulator listen&quot;);&lt;br&gt;return -1;&lt;br&gt;&#125;&lt;br&gt;if((contr_sock=makeServerSocket(controller_port))==-1)&lt;br&gt;&#123;&lt;br&gt;perror(&quot;error controller listen&quot;);&lt;br&gt;return -1;&lt;br&gt;&#125;&lt;br&gt;if((sys_sock=makeServerSocket(system_port))==-1)&lt;br&gt;&#123;&lt;br&gt;perror(&quot;error system listen&quot;);&lt;br&gt;return -1;&lt;br&gt;&#125;&lt;br&gt;if((epfd=epoll_create(EPOLL_QUEUE_LEN))==-1)</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (nikll)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#10</link>
    <pubDate>Thu, 17 Sep 2009 09:10:55 GMT</pubDate>
    <description>&amp;gt;Фуф, вроде справился, правда код вырос в 2 раза, но основную цель &lt;br&gt;&amp;gt;выполняет - есть 3 открытых порта, к к-ым может прицепиться множество &lt;br&gt;&amp;gt;народу на каждый, и будут они работать все вместе.. &lt;br&gt;&amp;gt;И вообщем ушел я от селектов... &lt;br&gt;&amp;gt;Сделал на epoll, вроде он побыстрее будет судя по диаграммкам С10К... &lt;br&gt;&amp;gt;Кого заинтересует - могу выложить код, не жалко.. Сам долго гуглил на &lt;br&gt;&amp;gt;более-менее нормальные примеры epoll. &lt;br&gt;&lt;br&gt;Выложи плиз :), интересно стало.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (socket_select_nonblock)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#9</link>
    <pubDate>Wed, 16 Sep 2009 16:46:00 GMT</pubDate>
    <description>Фуф, вроде справился, правда код вырос в 2 раза, но основную цель выполняет - есть 3 открытых порта, к к-ым может прицепиться множество народу на каждый, и будут они работать все вместе..&lt;br&gt;И вообщем ушел я от селектов...&lt;br&gt;Сделал на epoll, вроде он побыстрее будет судя по диаграммкам С10К...&lt;br&gt;Кого заинтересует - могу выложить код, не жалко.. Сам долго гуглил на более-менее нормальные примеры epoll.&lt;br&gt;</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (const86)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#8</link>
    <pubDate>Wed, 16 Sep 2009 07:51:51 GMT</pubDate>
    <description>&amp;gt;Потоки нужны, ибо планируется обеспечить взаимодействие между клиентами на разных портах, через процессы это вроде тяжело реализовать... &lt;br&gt;&lt;br&gt;Потоки нужны, если обработка тяжёлая и хочется заюзать несколько процов. Количество потоков определяется количеством процов. А клиентов всех засовывать в select (poll/epoll...) и обрабатывать асинхронно, это никак не помешает никаким взаимодействиям.&lt;br&gt;</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (Andrey)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#7</link>
    <pubDate>Wed, 16 Sep 2009 03:14:50 GMT</pubDate>
    <description>&amp;gt;&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;Потоки нужны, ибо планируется обеспечить взаимодействие между клиентами на разных портах,&lt;br&gt;&amp;gt; через процессы это вроде тяжело реализовать... &lt;br&gt;&lt;br&gt;Через процессы можно использовать IPC, но у меня опыта в IPC нету, поэтому тоже кажеться что сложно :-)&lt;br&gt;&lt;br&gt;&amp;gt;P.S. Может есть у кого примеры серверов с несколькими работающими портами и &lt;br&gt;&amp;gt;вызовами типа select&#092;poll&#092;epoll...? &lt;br&gt;&lt;br&gt;Примеров у меня нету, но могу посоветовать использовать какую-нибудь библиотеку, котороя умеет делать мультплексирование и прочие низкоуровневые штуки.&lt;br&gt;для C++ можно посмотреть ACE Framework (http://www.cs.wustl.edu/~schmidt/ACE.html) или POCO C++ (http://pocoproject.org/), обе библиотеки имеют примеры.&lt;br&gt;для C можно использовать glib (http://library.gnome.org/devel/glib/2.20/), я думаю что найдётся много OpenSource прокетов где можно посмотреть примеры использования glib, например pidgin использует glib&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (socket_select_nonblock)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#6</link>
    <pubDate>Wed, 16 Sep 2009 02:44:59 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;отдельный поток и там уже вызывать функцию accept(), правильно я понимаю? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Это один из вариантов. Есть как минимум ещё два стандартных пути: &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;  - вместо потоков для обработки данных каждого соединения использовать дочерние &lt;br&gt;&amp;gt;процессы &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;  - использовать более совершенные по сравнению с select() механизмы (ну &lt;br&gt;&amp;gt;хотя бы вызов poll()) и обеспечить переключение контекста в одном-единственном потоке, &lt;br&gt;&amp;gt;с ожиданием активности клиентов и их готовности к приёму данных &lt;br&gt;&lt;br&gt;Потоки нужны, ибо планируется обеспечить взаимодействие между клиентами на разных портах, через процессы это вроде тяжело реализовать...&lt;br&gt;&lt;br&gt;P.S. Может есть у кого примеры серверов с несколькими работающими портами и вызовами типа select&#092;poll&#092;epoll...?&lt;br&gt;</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (elvenic)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#5</link>
    <pubDate>Tue, 15 Sep 2009 21:01:14 GMT</pubDate>
    <description>Прочитал сам свое сообщение, по-моему вышло не совсем понятно. Короче, цикл должен быть один, вокруг select(), и без вложеных циклов. Когда select() сработает, нужно проверять готовность всех сокетов на чтение/запись/ошибку (из FD_SET&apos;ов которые были поданы как 2-й, 3-й и 4-и параметер select()&apos;у. Для каждого активного сокета, должен быть свой, отдельный, буффер с данными, и запомнена текущая позиция в каждом буфере, которая нужна чтобы точно знать сколько мы уже прочитали из сокета (если мы сейчас читаем из этого сокета) или записали (если мы сейчас пишем в этот сокет). Нужен также некий протокол который определяет когда все ожидаемые данные прочитаны из конкретного сокета (напр. NewLine или фиксированная длинна, или, как в HTTP, длинна данных передается в начале самих данных). Сразу после accept(), сокет находится в режиме чтения, когда (по протоколу) все данные прочитаны, сокет переводится в режим записи. Вот, такое вот дополнение к моему сообщению, может, так яснее.&lt;br&gt;&lt;br&gt;А так как реализовано автором, несмо</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (elvenic)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#4</link>
    <pubDate>Tue, 15 Sep 2009 20:24:29 GMT</pubDate>
    <description>&amp;gt;&#091;оверквотинг удален&#093;&lt;br&gt;&amp;gt;&amp;gt;отдельный поток и там уже вызывать функцию accept(), правильно я понимаю? &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;Это один из вариантов. Есть как минимум ещё два стандартных пути: &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;  - вместо потоков для обработки данных каждого соединения использовать дочерние &lt;br&gt;&amp;gt;процессы &lt;br&gt;&amp;gt;&lt;br&gt;&amp;gt;  - использовать более совершенные по сравнению с select() механизмы (ну &lt;br&gt;&amp;gt;хотя бы вызов poll()) и обеспечить переключение контекста в одном-единственном потоке, &lt;br&gt;&amp;gt;с ожиданием активности клиентов и их готовности к приёму данных &lt;br&gt;&lt;br&gt;И есть &quot;самый&quot; стандартный вариант :), который, очевидно и был нужен автору: не нужно цикла do-while вокруг recv()+send(), а вместо этого, нужно:&lt;br&gt;&lt;br&gt;а) создавать для каждого сокета свой буффер и запоминать сколько уже данных записано в каждый буффер (текущая позиция в буфере, начальное значение 0), &lt;br&gt;б) для каждого сокета готового к чтению, прочитать (recv()) (без цикла - один раз!) столько, сколько сокет отдаст, в буффер этого сокета начиная с текущей позиции, и потом увеличить текущую позицию на количество</description>
</item>

<item>
    <title>Сервер с 3мя открытыми портами и select() (DeadMustdie)</title>
    <link>https://opennet.me/openforum/vsluhforumID9/8433.html#3</link>
    <pubDate>Tue, 15 Sep 2009 17:12:50 GMT</pubDate>
    <description>&amp;gt; Значит после того, как FD_ISSET просигналил о появлении соединения, нужно создавать &lt;br&gt;&amp;gt;отдельный поток и там уже вызывать функцию accept(), правильно я понимаю? &lt;br&gt;&lt;br&gt;Это один из вариантов. Есть как минимум ещё два стандартных пути:&lt;br&gt;&lt;br&gt;  - вместо потоков для обработки данных каждого соединения использовать дочерние процессы&lt;br&gt;&lt;br&gt;  - использовать более совершенные по сравнению с select() механизмы (ну хотя бы вызов poll()) и обеспечить переключение контекста в одном-единственном потоке, с ожиданием активности клиентов и их готовности к приёму данных&lt;br&gt;</description>
</item>

</channel>
</rss>
