<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: Первый многопользовательский серевер с использованием epoll(...</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8543.html</link>
    <description>Всем привет.&lt;br&gt;Пытаюсь освоить сетевое программирование на низком уровне(POSIX API). Интересна задача реализовать многопользовательский сервер использующий механизм epoll().&lt;br&gt;В программировании не новичек. В сетевом программировании есть пробелы :)&lt;br&gt;Вот что я набросал. Но не все понятно. Если не затруднит, прокоментируйте код, может что-то не правильно сделал, возможно есть более правильное решение.&lt;br&gt;&#091;code&#093;&lt;br&gt;&lt;br&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br&gt;#include &amp;lt;errno.h&amp;gt;&lt;br&gt;#include &amp;lt;string.h&amp;gt;&lt;br&gt;#include &amp;lt;netinet/in.h&amp;gt;&lt;br&gt;#include &amp;lt;arpa/inet.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/epoll.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br&gt;#include &amp;lt;sys/socket.h&amp;gt;&lt;br&gt;&lt;br&gt;#define ZEROPOD(var) memset(&amp;var, 0, sizeof(var))&lt;br&gt;&lt;br&gt;const int MYPORT = 1234;&lt;br&gt;const int qsize = 10;&lt;br&gt;const int epsize= 10;&lt;br&gt;&lt;br&gt;/** устанавливает неблокирующий режим для указанного сокета */&lt;br&gt;int setnonblocking(int sock) &#123;&lt;br&gt;int opts = fcntl(sock,F_GETFL);&lt;br&gt;if (opts &amp;lt; 0) &#123;&lt;br&gt;perror(&quot;fcntl(F_GETFL)&quot;);&lt;br&gt;return -1;&lt;br&gt;&#125;&lt;br&gt;opts = (opts &amp;#124; O_NONBLOCK);&lt;br&gt;if (fc</description>

<item>
    <title>Первый многопользовательский серевер с использованием epoll(... (BigHO)</title>
    <link>https://opennet.ru/openforum/vsluhforumID9/8543.html#1</link>
    <pubDate>Sun, 13 Dec 2009 13:12:49 GMT</pubDate>
    <description>&amp;gt;    if ( event &amp; EPOLLIN ) &#123; &lt;br&gt;&amp;gt;     /* сокет готов для чтения */ &lt;br&gt;&amp;gt;     printf(&quot;descriptor &#037;d ready for read&#092;n&quot;, sock_fd); &lt;br&gt;&amp;gt;     char buff&#091;32&#093; = &quot;&#092;0&quot;; &lt;br&gt;&lt;br&gt;тут не надо инициализации буфера как &quot;&#092;0&quot; - все равно перезапишется.&lt;br&gt;&lt;br&gt;&amp;gt;     int rd = read(sock_fd, &amp;buff, sizeof(buff)); &lt;br&gt;&lt;br&gt;вызов read принимает вторым аргументом не указатель-на-указатель, а указатель на буфер - он же никуда его двигать не собирается: просто запихнуть в буфер что-то.&lt;br&gt;&lt;br&gt;тобишь будет строка как:&lt;br&gt;int rd = read(sock_fd, buff, sizeof(buff));&lt;br&gt;&lt;br&gt;&amp;gt;     fprintf(stderr, &quot;&#037;s&#092;n&quot;, buff); &lt;br&gt;&amp;gt;    &#125; &lt;br&gt;&amp;gt;    if ( event &amp; EPOLLOUT ) &#123; &lt;br&gt;&amp;gt;     /* сокет готов для записи */ &lt;br&gt;&amp;gt;     printf(&quot;descriptor &#037;d ready for write&#092;n&quot;, sock_fd); &lt;br&gt;&lt;br&gt;вот это лишнее - контроль выходного потока нужно ставить если данных в ответе накопилось больше, чем на одну операцию write. Некоторые предпочитают дождаться EBUSY ошибки, прежде чем подписываться на информирование об этом сигнале.&lt;br&gt;&lt;br&gt;&amp;gt;    &#125;&lt;br&gt;&lt;br&gt;&amp;lt;кусь&amp;gt; - ибо неважно&lt;br&gt; &lt;br&gt;&amp;gt;    if ( event &amp; EPOLLERR ) &#123; &lt;br&gt;&amp;gt;     /* какая-то ош</description>
</item>

</channel>
</rss>
