<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720374</guid>
        <pubDate>Sat, 06 May 2017 07:08:31 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720374</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>ter_nk_</strong> :D]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720362</guid>
        <pubDate>Sat, 06 May 2017 05:15:57 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720362</link>
        <description><![CDATA[ter_nk_: да, все работает c shutdown(socket, 1) &#33;]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720225</guid>
        <pubDate>Fri, 05 May 2017 07:04:36 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720225</link>
        <description><![CDATA[ter_nk_: Спасибо, второй Олег&#33;]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720223</guid>
        <pubDate>Fri, 05 May 2017 06:55:38 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720223</link>
        <description><![CDATA[Oleg2004: Вот кое какие сведения на этот счет:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Результаты закрытия сокета с помощью close() существенно отличается от результата вызова shutdown(). По сути вызов shutdown() не закрывает сокет по-настоящему, даже если он осуществлен с параметром 2. Ни сокет, ни ассоциированные с ним ресурсы (за исключением буфера приема при how=0 или 2) система не освобождает. <br>
Особо отметим, что вызов shutdown() воздействует на все процессы, для которых этот сокет является открытым (например, в дочернем процессе после вызова fork()). В результате вызов shutdown() с параметром how=1 запретит запись в этот сокет всем использующим его процессам. При вызове же close() или его Windows-аналога closesocket() все другие процессы могут продолжать пользоваться сокетом.<br>
Если надо окончательно закрыть (и уничтожить) конкретный сокет в данном процессе, после shutdown() с параметрами 0 или 1 надо вызывать close().<br>
Вызывая shutdown() с how=1, отправитель будет точно знать, что другая сторона получит признак конца переданного файла EOF, даже если этот сокет открыт и другими процессами. При вызове close() или closesocket() это не гарантируется, поскольку TCP не пошлет FIN-сегмент, пока счетчик ссылок на данный сокет не станет равным нулю – т.е. когда все процессы закроют этот сокет.<br>
С помощью shutdown() реализуется так называемое аккуратное размыкание (orderly release) соединения, в результате чего обе стороны получат все предназначенные им данные до того, как соединение будет разорвано.<br>
Резюме: В Windows принято, что после вызова closesocket() соединение закрывается. Так же соединения закрываются при закрытии программы. Система знает, какому процессу соответствуют сокеты, и закрывает их при смерти приложения.<br>
В Linix и FreeBSD это не так. Необходимо явно сказать shutdown() (посылка FIN) и close() (разъединение дескриптора и сокета). Если этого не сделать, то после закрытия приложения сокеты еще будут висеть в системе некоторое время, в течение которого bind() на &quot;занятые&quot; порты будет возвращать ошибку.</div></div>]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720217</guid>
        <pubDate>Fri, 05 May 2017 06:23:14 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720217</link>
        <description><![CDATA[ter_nk_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410751&view=findpost&p=3720210'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Олег М &#064; <time class="tag-quote__quoted-time" datetime="2017-05-05T06:06:22+00:00">05.05.17, 06:06</time></span><div class='quote '>Он не закрывается скорее всего, потому что close не закрывает непосредственно дескриптор, а уменьшает какой-нибудь счётчик или типа того, и, если тот равен нулю, то закрывает. Т.е. ресурс не удаляется, пока кто-нибудь, в частности recv, держит ссылку на него.<br>
Проверь, что возвращает close(). А ещё есть функция shutdown(), попробуй, может она сможет отрубить recv.</div></div><br>
<br>
Да, вот точно, вот что надо будет проверить.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410751&view=findpost&p=3720210'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Олег М &#064; <time class="tag-quote__quoted-time" datetime="2017-05-05T06:06:22+00:00">05.05.17, 06:06</time></span><div class='quote '>Таймаут на recv ставится когда тебе нужно обязательно получить строго определённое количество данных, причём лично я обычно ставлю 30 сек. Но использую такое крайне редко.<br>
Если поставить маленький таймаут, то recv может отвалится во время получения данных, просто не успеет всё вычитать, либо сервер не успеет передать. Тогда ты не отличишь сбой соединения от нормальной работы.</div></div><br>
<br>
Да, здесь смотришь что получил, понимаешь, что не все данные, снова делаешь вызов recv чтоб дополучить остальное. Работает, но дурацкая архитектура.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410751&view=findpost&p=3720210'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Олег М &#064; <time class="tag-quote__quoted-time" datetime="2017-05-05T06:06:22+00:00">05.05.17, 06:06</time></span><div class='quote '>Обычно перед вызовом recv, я получаю кол-во данных в буфере сокета, FIONREAD, затем вызываю recv. </div></div><br>
<br>
Мне это не очень удобно, я не знаю, сколько данных может прийти.<br>
<br>
Спасибо&#33;]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720210</guid>
        <pubDate>Fri, 05 May 2017 06:06:22 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720210</link>
        <description><![CDATA[Олег М: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410751&view=findpost&p=3720205'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ter_nk_ &#064; <time class="tag-quote__quoted-time" datetime="2017-05-05T05:40:54+00:00">05.05.17, 05:40</time></span><div class='quote '>У меня блокирующий сокет, но я не мог его закрывать, добавил тайм-аут.</div></div><br>
Да, я так сначала и подумал. Потом обратил внимание на тему.<br>
Он не закрывается скорее всего, потому что close не закрывает непосредственно дескриптор, а уменьшает какой-нибудь счётчик или типа того, и, если тот равен нулю, то закрывает. Т.е. ресурс не удаляется, пока кто-нибудь, в частности recv, держит ссылку на него.<br>
Проверь, что возвращает close(). А ещё есть функция shutdown(), попробуй, может она сможет отрубить recv.<br>
<br>
Таймаут на recv ставится когда тебе нужно обязательно получить строго определённое количество данных, причём лично я обычно ставлю 30 сек. Но использую такое крайне редко.<br>
Если поставить маленький таймаут, то recv может отвалится во время получения данных, просто не успеет всё вычитать, либо сервер не успеет передать. Тогда ты не отличишь сбой соединения от нормальной работы.<br>
<br>
Обычно перед вызовом recv, я получаю кол-во данных в буфере сокета, FIONREAD, затем вызываю recv.]]></description>
        <author>Олег М</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720205</guid>
        <pubDate>Fri, 05 May 2017 05:40:54 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720205</link>
        <description><![CDATA[ter_nk_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=410751&view=findpost&p=3720203'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Олег М &#064; <time class="tag-quote__quoted-time" datetime="2017-05-05T05:32:50+00:00">05.05.17, 05:32</time></span><div class='quote '>Так у тебя сокет неблокирующий? А как он вообще в recv может зависнуть? </div></div><br>
<br>
У меня блокирующий сокет, но я не мог его закрывать, добавил тайм-аут.]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720203</guid>
        <pubDate>Fri, 05 May 2017 05:32:50 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720203</link>
        <description><![CDATA[Олег М: Так у тебя сокет неблокирующий? А как он вообще в recv может зависнуть?]]></description>
        <author>Олег М</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720200</guid>
        <pubDate>Fri, 05 May 2017 05:13:00 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720200</link>
        <description><![CDATA[ter_nk_: У меня так и есть когда я тайм-аут добавил, он вываливается по тайм-ауту или по приходу данных, вариант не устраивает. Т.е. просто внешне я не могу отрубить сокет который в recv висит. Делать с select можно, просто тогда переделывать. Хотел без этого обойтись а просто разрывать соединение.]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720195</guid>
        <pubDate>Fri, 05 May 2017 04:02:50 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720195</link>
        <description><![CDATA[Олег М: Таймаут для recv здесь делать нельзя, будет отваливаться при получении данных. <br>Для сокетов лучше в цикле вызывать select или poll с небольшим таймаутом ~10mc, потом recv, если пришли данные. <br>Тогда не будет проблем с задержкой при остановке программы.]]></description>
        <author>Олег М</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720140</guid>
        <pubDate>Thu, 04 May 2017 17:57:23 +0000</pubDate>
        <title>recv с неблокирующим сокетом</title>
        <link>https://forum.sources.ru/index.php?showtopic=410751&amp;view=findpost&amp;p=3720140</link>
        <description><![CDATA[ter_nk_: В линукс к моему удивлению вызванная в процессе функция close не закрывает сокет, который висит на прослушивании функцией recv. Уверен что в винде синхронный сокет закроется. Из ситуации можно выйти поставив на recv тайм-аут, но опять же закрытие сокета произойдет после<br>тайм-аута. Как мгновенно отключить сокет?]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	