<?xml version="1.0" encoding="koi8-r"?>
<rss version="0.91">
<channel>
    <title>OpenForum RSS: UDP-сервер под xinetd</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8143.html</link>
    <description>Добрый день!&lt;br&gt;&lt;br&gt;Столкнулся с трудностями с реализацией UDP-сервера, запускаемого из xinet.d. Задача элементарная: я с одной сетевой машины (&quot;клиента&quot;) запускаю простенькую программку, она отправляет пакет на другую машину-сервер по определённому порту, слушаемому xinet.d, после чего происходит вызов моей программы-&quot;сервера&quot;.&lt;br&gt;&lt;br&gt;И если с протоколом TCP всё было ясно (смотрел вывод stdin и записывал его по fgets() в некоторый &amp;lt;char buffer&#091;256&#093;&amp;gt;), то у UDP всё гораздо серьёзнее. Запускаю на удалённой машине такой же простенький &quot;клиент&quot;, он отдаёт сообщение на &quot;сервер&quot;, моя программа-&quot;сервер&quot; запускается, но из stdin&apos;а я абсолютно ничего не получаю. Нашёл в книжке такой пример (&quot;Запуск приложения через inetd&quot;). Здесь используется не вывод stdin, а следующая конструкция:&lt;br&gt;&lt;br&gt;pid = sprintf(buf, &quot;&#037;d: &quot;, getpid());&lt;br&gt;len = sizeof(peer);&lt;br&gt;rc = recvfrom(0, buf+pid, sizeof(buf)-pid, 0, (struct sockaddr*)&amp;peer, &amp;len);&lt;br&gt;&lt;br&gt;Попробовал её, но и здесь результат - нулевой. Конфигурация конф. файла xinet.d такова:&lt;br&gt;&lt;br&gt;service my_</description>

<item>
    <title>UDP-сервер под xinetd (jd2)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8143.html#2</link>
    <pubDate>Mon, 16 Mar 2009 15:42:36 GMT</pubDate>
    <description>&amp;gt;где  0 - нулевой идентификатор (&quot;как бы&quot; сокета) &lt;br&gt;&lt;br&gt;Не &quot;как бы&quot;, а самый что ни на есть настоящий сокет. Просто inetd передаёт его дочернему процессу (Вашему демону) в виде нулевого файлового дескриптора: man dup2(2). Кстати, в случае с TCP происходит абсолютно то же самое, а read(fd, buf, len) в данном случае, если я не ошибаюсь, полностью идентично вызову recv(fd, buf, len, 0).&lt;br&gt;</description>
</item>

<item>
    <title>UDP-сервер под xinetd (Lex Grant)</title>
    <link>https://www.opennet.ru/openforum/vsluhforumID9/8143.html#1</link>
    <pubDate>Thu, 12 Mar 2009 10:39:20 GMT</pubDate>
    <description>Проблема снята. На всякий случай привожу здесь результаты.&lt;br&gt;&lt;br&gt;Для UDP всё решается путём введения функции следующего вида:&lt;br&gt;recvfrom(0, buffer, sizeof (buffer), 0, (struct sockaddr *)&amp;peer, (socklen_t*)&amp;len),&lt;br&gt;&lt;br&gt;где  0 - нулевой идентификатор (&quot;как бы&quot; сокета)&lt;br&gt;peer - указатель на структуру sockaddr_in&lt;br&gt;buffer - строковый массив&lt;br&gt;len - преобразованный численный размер структуры peer&lt;br&gt;&lt;br&gt;Тогда, действительно, считываются данные, пришедшие на открытый сокет udp супер-сервера xinet.d.&lt;br&gt;</description>
</item>

</channel>
</rss>
