<?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=414930&amp;view=findpost&amp;p=3800600</guid>
        <pubDate>Sat, 01 Jun 2019 20:23:35 +0000</pubDate>
        <title>Проблема с сокетами</title>
        <link>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800600</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414930&view=findpost&p=3800542'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ter_nk_ &#064; <time class="tag-quote__quoted-time" datetime="2019-05-31T16:17:31+00:00">31.05.19, 16:17</time></span><div class='quote '>В смысле перед close и shutdown recv вызвать?</div></div><br>
Именно так...с проверкой на 0. Это происходит когда сервер послал сегмент FIN. Клиентская часть TCP это понимает и принимает и сообщает непосредственно программе клиента возвратом в Recv() 0 - нуля... <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-06-01T23:24:59+03:00">01.06.19, 20:24</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414930&view=findpost&p=3800542'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ter_nk_ &#064; <time class="tag-quote__quoted-time" datetime="2019-05-31T16:17:31+00:00">31.05.19, 16:17</time></span><div class='quote '>Спасибо&#33; </div></div><br>
Не за что...если все работает, то и Слава Богу... :)]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800542</guid>
        <pubDate>Fri, 31 May 2019 16:17:31 +0000</pubDate>
        <title>Проблема с сокетами</title>
        <link>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800542</link>
        <description><![CDATA[ter_nk_: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414930&view=findpost&p=3800541'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2019-05-31T15:57:11+00:00">31.05.19, 15:57</time></span><div class='quote '>Так вот, закрытие соединения по открытому сокету - единственному на каждый коннект - корректно производится после того, как клиент получил со стороны сервера приглашение закрыть сокет. После того как сервер это предложит, клиентский recv() получает 0.</div></div><br>
<br>
В смысле перед close и shutdown recv вызвать?<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414930&view=findpost&p=3800541'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2019-05-31T15:57:11+00:00">31.05.19, 15:57</time></span><div class='quote '>В Винде после этого клиент должен выполнить closesocket(), а вот в некоторых nix*-совых операционках для корректного завершения соединения надо вызывать две функции<br>
shutdown() а затем close().</div></div><br>
<br>
Там все очень хорошо работает. Я пока сделал так, что каждый раз вызываю так<br>
close() (кроме первого соединения)<br>
socket()<br>
connect() <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2019-05-31T16:17:56+00:00">31.05.19, 16:17</time></span></span><br>
Спасибо&#33;]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800541</guid>
        <pubDate>Fri, 31 May 2019 15:57:11 +0000</pubDate>
        <title>Проблема с сокетами</title>
        <link>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800541</link>
        <description><![CDATA[Oleg2004: Потом result = connect(sock,....<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=414930&view=findpost&p=3800527'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ter_nk_ &#064; <time class="tag-quote__quoted-time" datetime="2019-05-31T12:18:49+00:00">31.05.19, 12:18</time></span><div class='quote '>Хотя должно быть разорвано </div></div><br>
Сколько я понимаю, это у вас некий TCP-клиент, который куда то коннектится<br>
Так вот, закрытие соединения по открытому сокету - единственному на каждый коннект - корректно производится после того, как клиент получил со стороны сервера приглашение закрыть сокет. После того как сервер это предложит, клиентский recv() получает 0. Поэтому всегда следует проверять recv()на 0&#33;&#33;&#33; В Винде после этого клиент должен выполнить closesocket(), а вот в некоторых nix*-совых операционках для корректного завершения соединения надо вызывать две функции<br>
shutdown()  а затем close().<br>
Ну и вот вырезка из моего курса лекций<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Следует также иметь в виду следующее важное обстоятельство. Если соединение по данному сокету не удалось, то сокет (для некоторых типов ошибок) оказывается в неспецифицированном состоянии, и следует обязательно закрыть только-что неудачно использованный сокет. Перед новым вызовом connect(), например в цикле, вновь должен быть произведен вызов socket(). Приложения, соответствующие стандарту POSIX-2001, должны закрыть дескриптор sd с помощью close(), после чего создать новый сокет для продолжения попыток установить соединение. Однако, если <strong class='tag-b'>попытка соединения не удалась по причинам WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT, то приложение может повторить вызов connect() для этого же сокета.</strong> При этом поведение системы зависит от операционной системы. Так, для Windows модуль TCP оставляет для повторного соединения тот же самый локальный порт, который был выбран системой для адреса локального сокета незавершенного соединения. Linux для попытки повторного соединения выбирает следующий свободный номер порта.</div></div><br>
Ну вот где то так... :)]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800527</guid>
        <pubDate>Fri, 31 May 2019 12:18:49 +0000</pubDate>
        <title>Проблема с сокетами</title>
        <link>https://forum.sources.ru/index.php?showtopic=414930&amp;view=findpost&amp;p=3800527</link>
        <description><![CDATA[ter_nk_: На Stm32<br><br>Делаю <br><br>int sock = socket(AF_INET, SOCK_STREAM, 0)<br><br>Потом result = connect(sock,....<br><br>Первое соединение нормально, потом result не 0 а 0xffffffff<br><br>errno EISCONN<br><br>Хотя должно быть разорвано <br><br>Если перед новым соединение делать каждый раз <br>socket(AF_INET, SOCK_STREAM, 0) то нормально, но на какой-нибудь раз да падает.]]></description>
        <author>ter_nk_</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	