<?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=391249&amp;view=findpost&amp;p=3494318</guid>
        <pubDate>Wed, 25 Jun 2014 19:17:01 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494318</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494313'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-25T22:41:22+04:00">25.06.14, 18:41</time></span><div class='quote '>как раз таки на recvfrom()</div></div><br>
Ну это уже тонкости...recv() - здесь в смысле &quot;работает на получение :) &quot;<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494313'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-25T18:41:22+00:00">25.06.14, 18:41</time></span><div class='quote '>На сервере мы делаем bind на 10001 и connect на 22375. На клиенте мы биндимся на 22375 и коннектимся на 10001.<br>
И работаем на сокетах через send и recv - архитектурной разницы между клиентским и серверным сокетом нету кроме их зеркального отображения. </div></div><br>
Ну это уже несколько из другой оперы - и другого протокола пользовательского уровня.<br>
Ежику понятно, что одно и то же приложение может исполнять когда надо роль клиента, а надо - сервера...только все это надо закодить...]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494313</guid>
        <pubDate>Wed, 25 Jun 2014 18:41:22 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494313</link>
        <description><![CDATA[nemez: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Сервер всегда висит на recv().</div></div><br>
как раз таки на recvfrom() - так мы можем различать клиентов. И в случае чего им ответить. <br>
а без sockaddr это нереально. Да и ответить можно с серверного сокета kb,j с sendto, либо через send с предварительным connect. В двух случаях нам нужно знать куда слать. А узнать это можно только через recvfrom. <br>
Вот клиенскому сокету как раз таки правильно всегда висеть на rcv - он будет принимать дату только от сервера. <br>
А если нам надо сделать сокет, для которого src и dst порты будут фиксированы - в этом случае нужно использовать связку bind() и connect(). <br>
И пофиг какой это сокет - клиенский или серверный. Эта тема применяется в ip телефонии очень активно<br>
Принимать дату он будет исключительно на порт для которого сделан bind() - если сокет рассматривается как серверный то bind делается на src порт а connect на dst. И все с точностью до наоборот для клиента. <br>
Скажем, нам необходимо передавать речевой трафик с порта 22375 на порт 10001. <br>
На сервере мы делаем bind на 10001 и connect на 22375. На клиенте мы биндимся на 22375 и коннектимся на 10001. <br>
И работаем на сокетах через send и recv - архитектурной разницы между клиентским и серверным сокетом нету кроме их зеркального отображения.]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494311</guid>
        <pubDate>Wed, 25 Jun 2014 18:25:53 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494311</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>nemez</strong><br>
Как то протокольно - да.<br>
Но модель клиент-сервер - работает.<br>
Сервер всегда висит на recv().<br>
На сервере - обязателен bind()]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494183</guid>
        <pubDate>Wed, 25 Jun 2014 11:53:43 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494183</link>
        <description><![CDATA[nemez: <strong class='tag-b'>Oleg2004</strong><br>
на самом деле на udp сокетах не особо есть какое-то понятие серверности и клиентности. <br>
Для того чтобы назначить src или dst порты, делаем bind() и connect()]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494060</guid>
        <pubDate>Wed, 25 Jun 2014 06:20:27 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494060</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Теперь посмотрим, что же произойдет, если в UDP-клиенте, например, вместо bind() записать connect()?<br>
Во-первых, ядро не будет инициировать &quot;переговорный процесс&quot;, т.к. в UDP его нет. Во-вторых, ядро просто запишет  в системную область памяти адресные данные удаленного хоста (IP-адрес и номер порта), на которые указывается в параметре вызова connect(), и на этом работа connect() завершится. Такой сокет называется &quot;соединенным&quot; (connected), в то время как по умолчанию для UDP создается &quot;несоединенный&quot; сокет <br>
&quot;Соединенный&quot; UDP-сокет налагает некоторые ограничения в его дальнейшем использовании. Вызов функции connect() в случае UDP фактически устанавливает фильтр для входящих дейтаграмм.</div></div><br>
Как видим, речь здесь идет о клиенте...<br>
А какой с него толк, если его убивают kill-9?]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494042</guid>
        <pubDate>Tue, 24 Jun 2014 22:22:55 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494042</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494041'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T22:21:03+00:00">24.06.14, 22:21</time></span><div class='quote '>А насчет коннекта таки да, обязательно надо попробовать&#33;</div></div><br>
после connect, кстати, нужно работать не через sendto и recvfrom, а через send и recv. Так, на всякий случай.]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494041</guid>
        <pubDate>Tue, 24 Jun 2014 22:21:03 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494041</link>
        <description><![CDATA[nemez: ну то что сообщения проходят - это факт. <br>А во всем остальном надо экспериментировать. <br>Может кто по этим граблям уже походил? <br>А насчет коннекта таки да, обязательно надо попробовать&#33;]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494040</guid>
        <pubDate>Tue, 24 Jun 2014 22:15:51 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494040</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494039'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T22:11:21+00:00">24.06.14, 22:11</time></span><div class='quote '>там английским по белому написано что мои предположения правильные.</div></div><br>
Написано, но не совсем там, где ты выделил. Я бы больше обратил внимание на это<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Remember that your socket must be &quot;connected&quot; in order to receive the ICMP errors. I&#39;ve been told that Linux will return them on &quot;unconnected&quot; sockets, but I haven&#39;t verfied it. This may cause porting problems if your application isn&#39;t ready for it.</div></div><br>
<br>
Т.е. тебе нужно вызвать connect() для сокета, т.е. работать с ним как с TCP. Можешь попробовать так, возможно выйдет. Но я бы рекомендовал проверить на всех платформах, особенно в винде. <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="2014-06-24T22:17:04+00:00">24.06.14, 22:17</time></span></span><br>
И да, там также написано:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494039'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T22:11:21+00:00">24.06.14, 22:11</time></span><div class='quote '>Since delivery of ICMP messages is not guarenteed you may not recieve this notification on the first transaction.</div></div><br>
т.е. это тоже не 100% гарантия, что сообщение о дисконнекте к тебе дойдёт]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494039</guid>
        <pubDate>Tue, 24 Jun 2014 22:11:21 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494039</link>
        <description><![CDATA[nemez: и да, вот что пишет мистер Стивенс<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>5.3 Does doing a connect() call affect the receive behaviourof the socket?<br>
<br>
From Richard Stevens ( rstevens@noao.edu):<br>
<br>
Yes, in two ways. First, only datagrams from your &quot;connected peer&quot; are returned. All others arriving at your port are not delivered to you.<br>
<br>
But most importantly, <strong class='tag-b'>a UDP socket must be connected to receive ICMP errors</strong>. Pp. 748-749 of &quot;TCP/IP Illustrated, Volume 2&quot; give all the gory details on why this is so.<br>
<br>
5.4 How can I read ICMP errors from &quot;connected&quot; UDP sockets?<br>
<br>
If the target machine discards the message because there is no process reading on the requested port number, it sends an ICMP message to your machine which will cause the next system call on the socket to return ECONNREFUSED. Since delivery of ICMP messages is not guarenteed you may not recieve this notification on the first transaction.<br>
<br>
Remember that your socket must be &quot;connected&quot; in order to receive the ICMP errors. I&#39;ve been told that Linux will return them on &quot;unconnected&quot; sockets, but I haven&#39;t verfied it. This may cause porting problems if your application isn&#39;t ready for it.<br>
</div></div><br>
<br>
там английским по белому написано что мои предположения правильные. Утром буду курить бамбук.]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494038</guid>
        <pubDate>Tue, 24 Jun 2014 22:09:59 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494038</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494037'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T21:55:57+00:00">24.06.14, 21:55</time></span><div class='quote '>читать там где про SO_BSDCOMPAT</div></div><br>
Повторюсь:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494005'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Хрен &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T19:27:34+00:00">24.06.14, 19:27</time></span><div class='quote '>поведение этого костыля меняется от версии к версии ядра, не понятно вообще, как оно ведёт себя в 3-й версии, и уж тем более это сделает твою прогу непереносимой на другие платформы.</div></div><br>
Т.е. в линуксе решили пойти против абстрагирования двух независимых протоколов и совместить их в этом плане на уровне сокетов. Но, как видно из цитаты<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>In later kernel versions, support for this option has been phased out: Linux 2.4 silently ignores it, and Linux 2.6 generates a kernel warning (printk()) if a program uses this option.</div></div><br>
эта фича в том виде, который именно тебе нужен, продержалась совсем недолго. Позже её свели просто на уровень ворнингов. Поэтому да, ты можешь заюзать эту опцию, если согласен, что твой софт сможет быть использован только на линуксе с ядром версии 2.2.]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494037</guid>
        <pubDate>Tue, 24 Jun 2014 21:55:57 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494037</link>
        <description><![CDATA[nemez: <a class='tag-url' href='http://man7.org/linux/man-pages/man7/socket.7.html' target='_blank'>http://man7.org/linux/man-pages/man7/socket.7.html</a><br>
читать там где про  SO_BSDCOMPAT]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494036</guid>
        <pubDate>Tue, 24 Jun 2014 21:46:10 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494036</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T21:40:29+00:00">24.06.14, 21:40</time></span><div class='quote '>туда помещается UDP заголовок</div></div><br>
Он туда помещается не по стандарту, и помещает его туда роутер. Когда ICMP ответ приходит на отправляющую сторону, он не поступает на сокет, т.к. UDP и ICMP - это разные протоколы, которые инкапсулируются внутрь IP, они между собой никак не связаны на уровне сокетов.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494034'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T21:40:29+00:00">24.06.14, 21:40</time></span><div class='quote '>Почему их не отлавливает система, хотя она это делать обязана судя по мануалам?</div></div><br>
С этого места поподробнее. Что за мануалы? Желаю лицезреть :)]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494034</guid>
        <pubDate>Tue, 24 Jun 2014 21:40:29 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494034</link>
        <description><![CDATA[nemez: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Это формат ICMP пакета. Причём тут UDP?</div></div><br>
Internet Header + 64 bits of Original Data Datagram - туда помещается UDP заголовок<br>
При этом имеем цепочку. Датаграмму ICMP - Заголовок IP - Заголовок UDP. <br>
Для каждого пакета, отправленного в никуда. Можно было бы говорить что UDP ни при чем, но его заголовок содержится в ICMP датаграмме. Это ЖЖЖЖЖЖ неспроста&#33;<br>
 <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Анализируя 64 бита, которые несет в себе ICMP-пакет, система знает - какому приложению послать сответствующее оповещение. Приложению....а не сокету.</div></div><br>
а как получить это оповещение? <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="2014-06-24T21:45:58+00:00">24.06.14, 21:45</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Нет в UDP соединения, а потому нет и &quot;connection reset by peer&quot;</div></div><br>
зато есть &quot;port unreachable&quot; и кстати событие &quot;connection reset by peer&quot; в TCP отрабатывается именно таким способом - через ICMP]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494029</guid>
        <pubDate>Tue, 24 Jun 2014 21:25:07 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494029</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494024'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T21:08:23+00:00">24.06.14, 21:08</time></span><div class='quote '>| Internet Header + 64 bits of Original Data Datagra<br>
что в свою очередь обозначает что на каждый такой пакет следует ICMP датаграмма с оригинальным заголовком.<br>
Получив такую датаграмму, система знает номера портов и говорит сокету о том что с передачей происходит фигня.</div></div><br>
Не совсем так.<br>
Сообщение ICMP получает сетевой уровень - т.е. модуль ICMP<br>
Анализируя 64 бита, которые несет в себе ICMP-пакет, система знает - какому <strong class='tag-b'>приложению</strong> послать сответствующее оповещение. Приложению....а не сокету.<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Тот в свою очередь при send получает код ошибки и говорит юзеру что connection reset by peer. </div></div><br>
Нет в UDP соединения, а потому нет и &quot;connection reset by peer&quot;]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494026</guid>
        <pubDate>Tue, 24 Jun 2014 21:16:28 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494026</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3494024'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-24T21:08:23+00:00">24.06.14, 21:08</time></span><div class='quote '>Type | Code | Checksum |<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
| unused |<br>
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
| Internet Header + 64 bits of Original Data Datagra</div></div><br>
<br>
Это формат ICMP пакета. Причём тут UDP? И да, ICMP - это датаграммы. И да, на ICMP запрос приходит ответ с теми же данными, которые были отправлены. И да, с ICMP работает совсем другой тип сокета.]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494024</guid>
        <pubDate>Tue, 24 Jun 2014 21:08:23 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494024</link>
        <description><![CDATA[nemez: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Ваш UDP сокет описан как SOCK_DGRAM...<br>
И никакого отношения к IPPROTO_ICMP</div></div><br>
имеет, при том самое непосредственное&#33; <br>
<br>
RFC 792 говорит нам что: <br>
<br>
<br>
 Type      |     Code      |          Checksum             |<br>
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
   |                             unused                            |<br>
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+<br>
   |      Internet Header + 64 bits of Original Data Datagra<br>
<br>
что в свою очередь обозначает что на каждый такой пакет следует ICMP датаграмма с оригинальным заголовком. <br>
Получив такую датаграмму, система знает номера портов и говорит сокету о том что с передачей происходит фигня. <br>
Тот в свою очередь при send получает код ошибки и говорит юзеру что connection reset by peer.]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494017</guid>
        <pubDate>Tue, 24 Jun 2014 20:37:26 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494017</link>
        <description><![CDATA[Oleg2004: Во первых по поводу kill-9<br>
Смотрите <a class='tag-url' href='http://habrahabr.ru/post/95102/' target='_blank'> здесь</a><br>
Не рекомендуют. Но это по большому счету к проблеме мало.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Хрен &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T19:08:53+00:00">23.06.14, 19:08</time></span><div class='quote '>ICMP приходит отправляющей стороне как информирование о недоступности адресата, но ICMP не попадает на UDP&#39;шный сокет, т.к. он не имеет к нему никакого отношения. </div></div><br>
Совершенно справедливо. ICMP -  к UDP-сокету не имеет никакого отношения.<br>
Если нет RAW-сокета, куда модуль ICMP может послать свой пакет, то его путь заканчивается в стеке на сетевом уровне.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493649'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T22:09:19+00:00">23.06.14, 22:09</time></span><div class='quote '>Если такой трафик пришел, то сокет должен эту тему отработать. По крайней мере для этого есть все предпосылки. </div></div><br>
Ваш UDP сокет описан как SOCK_DGRAM...<br>
И никакого отношения к IPPROTO_ICMP<br>
<br>
Ну а по сути - <strong class='tag-b'>Хрен</strong> совершенно прав - это UDP, и коль скоро вы убили клиента - серверу это по барабану. Пока он не закончит отсылку своего буфера - он будет слать свои пакеты &quot;На деревню к дедущке&quot;]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494005</guid>
        <pubDate>Tue, 24 Jun 2014 19:27:34 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3494005</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493649'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T22:09:19+00:00">23.06.14, 22:09</time></span><div class='quote '>Если такой трафик пришел, то сокет должен эту тему отработать. По крайней мере для этого есть все предпосылки. </div></div><br>
Специально полистал первоначальный (1981 год) стандарт на эту тему. Именно первоначальный, т.к. сокеты были сделаны в 1983-м, и с того времени не менялись.<br>
Дык вот...<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>If, according to the information in the gateway&#39;s routing tables, the network specified in the internet destination field of a datagram is unreachable, e.g., the distance to the network is infinity, the gateway <strong class='tag-b'>may</strong> send a destination unreachable message to the internet source host of the datagram. In addition, in some networks, the gateway <strong class='tag-b'>may</strong> be able to determine if the internet destination host is unreachable. Gateways in these networks <strong class='tag-b'>may</strong> send destination unreachable messages to the source host when the destination host is unreachable.<br>
<br>
If, in the destination host, the IP module cannot deliver the datagram because the indicated protocol module or process port is not active, the destination host <strong class='tag-b'>may</strong> send a destination unreachable message to the source host.<br>
<br>
Another case is when a datagram must be fragmented to be forwarded by a gateway yet the Don&#39;t Fragment flag is on. In this case the gateway must discard the datagram and <strong class='tag-b'>may</strong> return a destination unreachable message.<br>
</div></div><br>
<br>
Вобщем, в этой версии маршрутизаторы не обязывают слать это подтверждение. Только уже позже, когда API сокетов было сформировано, &quot;may&quot; заменили на &quot;should&quot;, а потом уже и на &quot;must&quot;. Скорее всего, поэтому они и не умеют определять без ядерных костылей, о которых ты написал в последнем посте.<br>
Но я смотрю, поведение этого костыля меняется от версии к версии ядра, не понятно вообще, как оно ведёт себя в 3-й версии, и уж тем более это сделает твою прогу непереносимой на другие платформы. Так что я бы эту опцию не использовал, а добавил в протокол периодические проверочные посылки.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493649'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T22:09:19+00:00">23.06.14, 22:09</time></span><div class='quote '>ну это совсем не показатель - их писали кто попало левой ногой. Потому эта вся аська и накрылась медным тазом</div></div><br>
Аська накрылась не поэтому :)]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493933</guid>
        <pubDate>Tue, 24 Jun 2014 14:44:35 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493933</link>
        <description><![CDATA[nemez: и вот что пишет великая камасутра<br>
<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>SO_BSDCOMPAT<br>
		Enable BSD bug-to-bug compatibility.  This is used by the UDP protocol module in Linux  2.0<br>
		and  2.2.  <strong class='tag-b'><span class='tag-u'> If enabled ICMP errors received for a UDP socket will not be passed to the user<br>
		program. </span></strong> In later kernel versions, support for this option has been phased out: Linux  2.4<br>
		silently  ignores it, and Linux 2.6 generates a kernel warning (printk()) if a program uses<br>
		this option.  Linux 2.0 also enabled BSD bug-to-bug compatibility  options  (random  header<br>
		changing,  skipping  of  the broadcast flag) for raw sockets with this option, but that was<br>
		removed in Linux 2.2.</div></div>]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493649</guid>
        <pubDate>Mon, 23 Jun 2014 22:09:19 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493649</link>
        <description><![CDATA[nemez: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Не имеющая к UDP протоколу никакого отношения</div></div><br>
еще и как имеющая - по крайней мере заголовок исходного UDP пакета в ней присутствует&#33; <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>но ICMP не попадает на UDP&#39;шный сокет</div></div><br>
а ему туда попадать не надо - по факту таких передач должен быть получен код возврата соответствующий и при помощи errno получить код ошибки, который скажет, что ошибка либо в отвале клиента, либо во фрагментации, либо закрытом порту. <br>
Если такой трафик пришел, то сокет должен эту тему отработать. По крайней мере для этого есть все предпосылки. <br>
Да и на худой конец можно подвязать libpcap или некую ерунду на raw sockets, и это событие перехватить. <br>
Но хочется все сделать через систему. Только не знаю как. <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="2014-06-23T22:10:36+00:00">23.06.14, 22:10</time></span></span><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>асько-клиентах (в частности в Миранде)</div></div><br>
ну это совсем не показатель - их писали кто попало левой ногой. Потому эта вся аська и накрылась медным тазом]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493610</guid>
        <pubDate>Mon, 23 Jun 2014 19:08:53 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493610</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493604'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T18:59:34+00:00">23.06.14, 18:59</time></span><div class='quote '>сверху UDP трафик</div></div><br>
Идущий до маршрутизатора, который дальше его не переправляет, т.к. некуда, но никак не информирует отправляющую сторону, т.к. протокол не обязывает.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493604'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T18:59:34+00:00">23.06.14, 18:59</time></span><div class='quote '>снизу - ICMP датаграмма</div></div><br>
Не имеющая к UDP протоколу никакого отношения :)<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493604'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T18:59:34+00:00">23.06.14, 18:59</time></span><div class='quote '>Система об этом знает и сокеты должны реагировать</div></div><br>
Система и сокеты не должны реагировать, т.к. UDP - протокол без подтверждения, контроля очерёдности и установления соединения. <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="2014-06-23T19:11:24+00:00">23.06.14, 19:11</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493610'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Хрен &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T19:08:53+00:00">23.06.14, 19:08</time></span><div class='quote '>Идущий до маршрутизатора, который дальше его не переправляет, т.к. некуда, но никак не информирует отправляющую сторону, т.к. протокол не обязывает.</div></div><br>
Тут ошибся немного. ICMP приходит отправляющей стороне как информирование о недоступности адресата, но ICMP не попадает на UDP&#39;шный сокет, т.к. он не имеет к нему никакого отношения. <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="2014-06-23T19:15:53+00:00">23.06.14, 19:15</time></span></span><br>
Если помнишь, в асько-клиентах (в частности в Миранде) был флажок &quot;посылать контрольные пакеты серверу&quot;. Если его не установить, то клиент очень долго после фактического дисконнекта мог не знать о пропаже сервера и слать сообщения вникуда. Естественно, после этого они пропадали. Собственно, это из той же оперы - ICQ работает поверх UDP протокола.]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493604</guid>
        <pubDate>Mon, 23 Jun 2014 18:59:34 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493604</link>
        <description><![CDATA[nemez: Да ладно нету контроля<br>
вот дамп<br>
<a class='tag-url' href='http://s019.radikal.ru/i618/1406/48/ef41ebe48822.jpg' target='_blank'>http://s019.radikal.ru/i618/1406/48/ef41ebe48822.jpg</a><br>
сверху UDP трафик, снизу - ICMP датаграмма, которая каждый из пакетов, отправляемых в никуда, дублирует вместе с заголовком. <br>
Система об этом знает и сокеты должны реагировать]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493596</guid>
        <pubDate>Mon, 23 Jun 2014 18:49:47 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493596</link>
        <description><![CDATA[Хрен: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=391249&view=findpost&p=3493586'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>nemez &#064; <time class="tag-quote__quoted-time" datetime="2014-06-23T18:09:56+00:00">23.06.14, 18:09</time></span><div class='quote '>Как ловить событие отваливания клиента ?<br>
Да, все безобразие происходит на ubuntu server</div></div><br>
Это же UDP, там нет соединения, подтверждения доставки, периодической проверки связи и т.д.<br>
Так что надо вручную реализовать подтверждение доставки, либо, если допустима потеря нескольких пакетов, сделать контрольные проверочные пакеты периодические, на которые от клиента должен будет прийти ответ.]]></description>
        <author>Хрен</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493586</guid>
        <pubDate>Mon, 23 Jun 2014 18:09:56 +0000</pubDate>
        <title>send udp - ICMP error..</title>
        <link>https://forum.sources.ru/index.php?showtopic=391249&amp;view=findpost&amp;p=3493586</link>
        <description><![CDATA[nemez: Вопрос таков. <br>
Есть сервер, с которого к клиенту валит трафик по UDP <br>
Банальным sendto <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">res = ::sendto(socket, data, data_length, 0, reinterpret_cast&#60;sockaddr*&#62;(&amp;dst), sizeof(dst));</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
идет передача, sendto возвращает количество байт, все шоколадно.<br>
Далее. Делаем клиенту kill -9 <br>
Смотрим на происходящее в канале сниффером и наблюдаем, что трафик продолжает идти.. <br>
Но при этом (внимание&#33;&#33;) С маршрутизатора, а говоря проще с моего мирового айпишника на мой локальный (192.168 ... ) валит ICMP трафик, <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Internet Control Message Protocol<br>
Type: 3 (Destination unreachable)<br>
Code: 3 (Port unreachable)<br>
</div></div><br>
при этом sendto отчитывается о том что у него все нормально и вся дата отправляется в полном объеме, <br>
errno тоже success. <br>
Как ловить событие отваливания клиента ?<br>
Да, все безобразие происходит на ubuntu server]]></description>
        <author>nemez</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	