<?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=347624&amp;view=findpost&amp;p=3049135</guid>
        <pubDate>Wed, 21 Dec 2011 08:04:44 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3049135</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3049052'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-21T11:02:17+04:00">21.12.11, 07:02</time></span><div class='quote '>Хотя, к сожалению, ничего кроме больших sleep&#39;ов после send&#39;а не помогает. :(</div></div><br>
Попробуй взять тест отсюда: <a class='tag-url' href='http://www.rsdn.ru/article/unix/sockets.xml' target='_blank'>RSDN</a><br>
Просто интересно - будет работать или нет ?]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3049077</guid>
        <pubDate>Wed, 21 Dec 2011 07:20:18 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3049077</link>
        <description><![CDATA[niXman: <strong class='tag-b'>Stuart</strong>, если есть желание, напиши компилябельный+минимальный код клиента и сервера воспроизводящий ошибку. мне влом писать.<br>
ошибку исправлю.]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3049052</guid>
        <pubDate>Wed, 21 Dec 2011 07:02:17 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3049052</link>
        <description><![CDATA[Stuart: Друзья, спасибо всем за помощь. Хотя, к сожалению, ничего кроме больших sleep&#39;ов после send&#39;а не помогает. :( Видимо, придётся переводить на boost::asio.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048862</guid>
        <pubDate>Tue, 20 Dec 2011 18:18:15 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048862</link>
        <description><![CDATA[Adil: Я делал отсылку всё-таки с использованием select. Подгоняя к коду negram&#39;a как-то так получается:<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">&nbsp;&nbsp; int timeout_counter = 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; ...</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; n = send( m_apClient-&#62;getSock(), pData + total, ulLen - total, 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; if (n == -1)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ( errno == EAGAIN || errno == EWOULDBLOCK)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // не получилось отправить - недостаточно места в буфере</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fd_set fd;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FD_ZERO(&amp;fd);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FD_SET(m_socket, &amp;fd);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeval tv = {0, 10000};</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int nfds = m_apClient-&#62;getSock();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( &nbsp;select(nfds + 1, 0, &amp;fd, 0, &amp;tv) != SOCKET_ERROR )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( !FD_ISSET(m_socket, &amp;fd) )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if( --timeout_counter == 0 )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; //timeout</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; timeout_counter = 100;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else if( errno == EINTR )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; continue;// не получилось отправить - сигнал</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break; // а вот это уже ошибка. оправить, да, не получилось</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; total += n;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>Adil</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048741</guid>
        <pubDate>Tue, 20 Dec 2011 13:56:00 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048741</link>
        <description><![CDATA[Stuart: Если сделать так, то возникнет ошибка, о которой писал в начале темы: если подать на вход функции достаточно большое количество данных (около 300 Мбайт на локальном хосте и всего 100 Кбайт по локальной сети), то сокет просто отваливается по таймауту.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048675</guid>
        <pubDate>Tue, 20 Dec 2011 12:38:21 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048675</link>
        <description><![CDATA[negram: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048672'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T12:34:24+00:00">20.12.11, 12:34</time></span><div class='quote '><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">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;n = send( m_apClient-&#62;getSock(), pData + total, ulLen - total, 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( errno == EAGAIN )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;total += n;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div></ol></div></div></div></div></div></div><br>
по-моему, правильнее такой вариант:<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">&nbsp;&nbsp; n = send( m_apClient-&#62;getSock(), pData + total, ulLen - total, 0 );</div><div class="code_line">&nbsp;&nbsp; if (n == -1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;if ( errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; continue; // не получилось отправить - сигнал или недостаточно места в буфере</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;} else {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; break; // а вот это уже ошибка. оправить, да, не получилось</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">&nbsp;&nbsp;total += n;</div></ol></div></div></div></div><br>
<br>
* обработка EINTR - по желанию, иногда лучше проверить что пришло]]></description>
        <author>negram</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048672</guid>
        <pubDate>Tue, 20 Dec 2011 12:34:24 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048672</link>
        <description><![CDATA[Stuart: <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">bool CConnection::send_to_service( const sinom_char *pData, sinom_ulong ulLen )</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( !m_apClient )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;unsigned long total = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;int n;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;do </div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;n = send( m_apClient-&#62;getSock(), pData + total, ulLen - total, 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ( errno == EAGAIN )</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;total += n;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (n == SOCKET_ERROR)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (errno == ECONNRESET)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m_conn_state = connecting;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return false;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;LOG(&quot;error: &quot; &#60;&#60; errno &#60;&#60; &quot; &quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;} while (total &#60; ulLen);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return true;</div><div class="code_line">}</div></ol></div></div></div></div>]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048669</guid>
        <pubDate>Tue, 20 Dec 2011 12:30:53 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048669</link>
        <description><![CDATA[negram: Покажи лучше получившийся код...]]></description>
        <author>negram</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048666</guid>
        <pubDate>Tue, 20 Dec 2011 12:29:30 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048666</link>
        <description><![CDATA[Stuart: В recv данных нет. С моей логикой доходили, но при больших объёмах данных сокет отваливается.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048665</guid>
        <pubDate>Tue, 20 Dec 2011 12:26:21 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048665</link>
        <description><![CDATA[niXman: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048662'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T12:23:19+00:00">20.12.11, 12:23</time></span><div class='quote '>Не понятно, почему даже 1 кбайт не приходит.</div></div><br>
что значит &quot;не приходит&quot; ?]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048662</guid>
        <pubDate>Tue, 20 Dec 2011 12:23:19 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048662</link>
        <description><![CDATA[Stuart: Да, 11 - это код EAGAIN. Обработчик ошибок есть, но кроме 11 ошибки больше никаких вообще. Не понятно, почему даже 1 кбайт не приходит.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048648</guid>
        <pubDate>Tue, 20 Dec 2011 12:09:24 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048648</link>
        <description><![CDATA[niXman: <strong class='tag-b'>Stuart</strong>, ну так напиши условие обработки ошибок правильно. я ж от балды написал. ради примера на что акцентировать внимание.<br>
к тому же, еще и явно указал -<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048532'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>niXman &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T09:50:41+00:00">20.12.11, 09:50</time></span><div class='quote '>еще сделай нормальные проверки на допустимые ошибки, естественно. а то мне влом.</div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2011-12-20T12:10:31+00:00">20.12.11, 12:10</time></span></span><br>
ошибкой в твоем случае будет n == -1.<br>
<br>
или ты совсем маны не читаешь? <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2011-12-20T12:17:55+00:00">20.12.11, 12:17</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048634'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T11:52:26+00:00">20.12.11, 11:52</time></span><div class='quote '>errno == 11</div></div><br>
это код EAGAIN ?]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048634</guid>
        <pubDate>Tue, 20 Dec 2011 11:52:26 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048634</link>
        <description><![CDATA[Stuart: 1 кбайт просто не приходит, в errno == EAGAIN не заходит. Заходит при посылке 100 Кбайт 2 раза:<br>errno == 11, n == -1<br>errno == 11, n == 0<br><br>Если послать метр:<br>errno == 11, n == 19<br>errno == 11, n == 49133<br>errno == 11, n == 19<br>errno == 11, n == 49133<br>errno == 11, n == 19<br>errno == 11, n == 49133<br>errno == 11, n == 19<br>errno == 11, n == 16449<br>errno == 11, n == -1 (так до конца)]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048624</guid>
        <pubDate>Tue, 20 Dec 2011 11:38:43 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048624</link>
        <description><![CDATA[niXman: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048605'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T11:17:25+00:00">20.12.11, 11:17</time></span><div class='quote '>С равенством не приходит даже 1 кбайт. </div></div><br>
покажи значения errno и n после попытки отправить 1кб.]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048605</guid>
        <pubDate>Tue, 20 Dec 2011 11:17:25 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048605</link>
        <description><![CDATA[Stuart: С равенством не приходит даже 1 кбайт. :( Так как n == -1.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048588</guid>
        <pubDate>Tue, 20 Dec 2011 11:04:06 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048588</link>
        <description><![CDATA[negram: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048568'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>niXman &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T10:45:18+00:00">20.12.11, 10:45</time></span><div class='quote '>если send() возвращает &gt;= 0, значит ошибки не произошло. но errno может установится в EAGAIN, и это не означает что произошла ошибка.</div></div> Разве send() не вернёт -1 вместе с EAGAIN?]]></description>
        <author>negram</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048568</guid>
        <pubDate>Tue, 20 Dec 2011 10:45:18 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048568</link>
        <description><![CDATA[niXman: если send() возвращает &gt;= 0, значит ошибки не произошло. но errno может установится в EAGAIN, и это не означает что произошла ошибка.]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048559</guid>
        <pubDate>Tue, 20 Dec 2011 10:35:11 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048559</link>
        <description><![CDATA[Stuart: Наверное, имели в виду if (errno &#33;= EAGAIN) summ += n?]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048532</guid>
        <pubDate>Tue, 20 Dec 2011 09:50:41 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048532</link>
        <description><![CDATA[niXman: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T09:10:38+00:00">20.12.11, 09:10</time></span><div class='quote '>На boost&#39;ы времени нет переводить программу сейчас.</div></div><br>
так совсем недавно причина неиспользования boost.asio была другой.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048500'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T09:10:38+00:00">20.12.11, 09:10</time></span><div class='quote '>как исправить?</div></div><br>
выбросить select нафег, и в цикле, пока не будет отослана сумма байт всего буфера, проверять errno и повторять.<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">const char* ptr = ...</div><div class="code_line">const int len = ...</div><div class="code_line">int summ = 0;</div><div class="code_line">do {</div><div class="code_line">&nbsp;&nbsp; int n = send(sock, ptr+summ, len-summ, 0);</div><div class="code_line">&nbsp;&nbsp; if ( errno == EAGAIN ) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;summ += n;</div><div class="code_line">&nbsp;&nbsp; }</div><div class="code_line">} while ( summ &#60; len );</div></ol></div></div></div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2011-12-20T09:58:32+00:00">20.12.11, 09:58</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048532'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>niXman &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T09:50:41+00:00">20.12.11, 09:50</time></span><div class='quote '>if ( errno == EAGAIN ) {<br>
      summ += n;<br>
   }</div></div><br>
только тут еще сделай нормальные проверки на допустимые ошибки, естественно. а то мне влом.]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048500</guid>
        <pubDate>Tue, 20 Dec 2011 09:10:38 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048500</link>
        <description><![CDATA[Stuart: На boost&#39;ы времени нет переводить программу сейчас. Ошибку понял, только как исправить? Пробовал select и после send вставлять в блоке ошибки EAGAIN, управление возвращал только после выхода из select со значением больше 0. То есть буфер очищался и был готов принять следующий блок данных. <br><br>Да, если поставить тупой sleep в блоке EAGAIN на секунд 5, проблем нет... Но всё работает очень медленно, и такой код мне не нравится.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048495</guid>
        <pubDate>Tue, 20 Dec 2011 09:03:06 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048495</link>
        <description><![CDATA[niXman: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048413'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T07:32:09+00:00">20.12.11, 07:32</time></span><div class='quote '>код должен работать на kernel 2.4</div></div><br>
будет работать: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_asio/overview/implementation.html<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048413'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T07:32:09+00:00">20.12.11, 07:32</time></span><div class='quote '>Вызываю же select перед каждым вызовом send</div></div><br>
ну и зачем <strong class='tag-b'>перед</strong>? ну допустим, select тебе сообщил что сокет готов. ты в него пихаешь 32к, и сокет тебе может вернуть EAGAIN. чем тебе select тут поможет?<br>
да и вообще, не нужен тут select.]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048413</guid>
        <pubDate>Tue, 20 Dec 2011 07:32:09 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048413</link>
        <description><![CDATA[Stuart: На linux вызываю fcntl. boost::asio, увы, использовать не могу, так как код должен работать на kernel 2.4.<br><br>По цитате из дока так и не понял, что не так делаю. Вызываю же select перед каждым вызовом send, чтобы EAGAIN как раз не генерировался, так как сокет уже готов для записи и, по идее, отправил все данные.]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048384</guid>
        <pubDate>Tue, 20 Dec 2011 07:08:47 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048384</link>
        <description><![CDATA[niXman: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048366'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T06:39:58+00:00">20.12.11, 06:39</time></span><div class='quote '>///делаем неблокирующим<br>
unsigned long ulNonBlockingMode = 1;<br>
if (ioctlsocket(m_apClient-&gt;getSock(), FIONBIO, &amp;ulNonBlockingMode) &lt; 0)</div></div><br>
а где этот же фрагмент, но для линукс? ioctlsocket на линуксах никогда не встречал.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=347624&view=findpost&p=3048366'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Stuart &#064; <time class="tag-quote__quoted-time" datetime="2011-12-20T06:39:58+00:00">20.12.11, 06:39</time></span><div class='quote '>при попытке сразу же вызвать send валится исключение EAGAIN.</div></div><br>
а чего вы ожидали?<br>
<br>
&gt;man 7 socket<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
<strong class='tag-b'>It is possible to do non-blocking IO on sockets by setting the O_NONBLOCK flag on a socket file descriptor using fcntl(2). Then all operations that would block will (usually) return with EAGAIN (operation should be retried later);</strong> connect(2) will return EINPROGRESS error.<br>
</div></div> <br>
<br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2011-12-20T07:16:26+00:00">20.12.11, 07:16</time></span></span><br>
да. и почему бы не использовать что-то готовое, вроде <a class='tag-url' href='http://www.boost.org/doc/libs/1_48_0/libs/asio/index.html' target='_blank'>boost.asio</a>?]]></description>
        <author>niXman</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048366</guid>
        <pubDate>Tue, 20 Dec 2011 06:39:58 +0000</pubDate>
        <title>Проблема с сокетами под Linux</title>
        <link>https://forum.sources.ru/index.php?showtopic=347624&amp;view=findpost&amp;p=3048366</link>
        <description><![CDATA[Stuart: Друзья, имеется проблема при работе с сокетами под Linux&#39;ами.<br>
<br>
Создаю сокет:<br>
<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">bool CTcpClient::createSocket()</div><div class="code_line">{</div><div class="code_line">SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);</div><div class="code_line">&nbsp;</div><div class="code_line">if(sock == INVALID_SOCKET)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;create socket failed&quot;);</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">int opt;</div><div class="code_line">int optlen = sizeof(opt);</div><div class="code_line">int iRet;</div><div class="code_line">&nbsp;</div><div class="code_line">opt = 64*1024;</div><div class="code_line">iRet = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char*)&amp;opt, optlen);</div><div class="code_line">if (iRet != 0)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;setsockopt SO_SNDBUF failed&quot;);</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">iRet = setsockopt( sock, SOL_SOCKET, SO_RCVBUF, (char*)&amp;opt, optlen );</div><div class="code_line">if (iRet != 0)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;setsockopt SO_RCVBUF failed&quot;);</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">setSock(sock); /// возвращаю созданный сокет в класс CTcpClient</div><div class="code_line">&nbsp;</div><div class="code_line">return true;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Задаём опции и подключаемся к удалённой машине по локальной сети:<br>
<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">void CConnection::connect_to_service()</div><div class="code_line">{</div><div class="code_line">COptionsSP options_w; /// класс для чтения конфигурационного файла, в котором задаются номера портов и т. д.</div><div class="code_line">TMultiConfigWraper multi_options;</div><div class="code_line">if (INodeSP parent = m_wpParent.lock())</div><div class="code_line">options_w = multi_options-&#62;getOptions(parent-&#62;GetCfgFile());</div><div class="code_line">else</div><div class="code_line">options_w = multi_options-&#62;getOptions(&quot;&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">m_conn_state = connecting;</div><div class="code_line">/*</div><div class="code_line">enum EConnState { connecting, worked, aborted };</div><div class="code_line">EConnState m_conn_state;</div><div class="code_line">*/</div><div class="code_line">fd_set set;</div><div class="code_line">struct timeval timeout;</div><div class="code_line">int numsocks = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">timeout.tv_sec = 0;</div><div class="code_line">timeout.tv_usec = 100000;</div><div class="code_line">&nbsp;</div><div class="code_line">// к кому подключаемся</div><div class="code_line">unsigned short usPort = options_w-&#62;getListenPort();</div><div class="code_line">&nbsp;</div><div class="code_line">SOCKADDR_IN ServAddr;</div><div class="code_line">ServAddr.sin_family = AF_INET;</div><div class="code_line">ServAddr.sin_port = htons(usPort);</div><div class="code_line">ServAddr.sin_addr.s_addr = GetAddress();</div><div class="code_line">&nbsp;</div><div class="code_line">for (unsigned long i = 0; i &#60; m_conn_try; ++i)</div><div class="code_line">{</div><div class="code_line">if (connect(m_apClient-&#62;getSock(), (SOCKADDR *)&amp;ServAddr, sizeof(SOCKADDR_IN)) != SOCKET_ERROR) /// boost::shared_ptr&#60;CTcpClient&#62; m_apClient;</div><div class="code_line">{</div><div class="code_line">FD_ZERO(&amp;set);</div><div class="code_line">FD_SET(m_apClient-&#62;getSock(), &amp;set);</div><div class="code_line">&nbsp;</div><div class="code_line">numsocks = select(m_apClient-&#62;getSock(), 0, &amp;set, 0, &amp;timeout );</div><div class="code_line">&nbsp;</div><div class="code_line">if (numsocks == SOCKET_ERROR)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;select failed&quot;);</div><div class="code_line">work_tools::sleep(100);</div><div class="code_line">/*</div><div class="code_line">inline void sleep(int ms)</div><div class="code_line">{</div><div class="code_line">boost::xtime delay;</div><div class="code_line">to_time(ms, delay);</div><div class="code_line">boost::thread().sleep(delay);</div><div class="code_line">}</div><div class="code_line">*/</div><div class="code_line">continue;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">SOCKADDR_IN local_addr;</div><div class="code_line">int len = sizeof(SOCKADDR_IN);</div><div class="code_line">&nbsp;</div><div class="code_line">if (getsockname( m_apClient-&#62;getSock(), (SOCKADDR *)&amp;local_addr, (socklen_t*)&amp;len) == SOCKET_ERROR)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;getsockname failed&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">///делаем неблокирующим</div><div class="code_line">unsigned long ulNonBlockingMode = 1;</div><div class="code_line">if (ioctlsocket(m_apClient-&#62;getSock(), FIONBIO, &amp;ulNonBlockingMode) &#60; 0)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;ioctlsocket failed&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">m_apClient-&#62;setPort(ntohs(local_addr.sin_port)); // можно отправлять</div><div class="code_line">m_connect_event.set(connected);</div><div class="code_line">m_conn_state = worked;</div><div class="code_line">&nbsp;</div><div class="code_line">return;</div><div class="code_line">}</div><div class="code_line">else</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;connect failed&quot;);</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">work_tools::sleep(100);</div><div class="code_line">}</div><div class="code_line">m_conn_state = aborted;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Ну, и, собственно, функции отсылки:<br>
<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">bool CConnection::send_packet_impl(const char *pHead, unsigned long ulHeadLen, const char *pData, unsigned long ulLen)</div><div class="code_line">{</div><div class="code_line">if( !m_apClient )</div><div class="code_line">return false;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef WIN32</div><div class="code_line">DWORD sended = 0;</div><div class="code_line">WSABUF wbuf[2];</div><div class="code_line">&nbsp;</div><div class="code_line">wbuf[0].buf = const_cast&#60;char*&#62;(pHead);</div><div class="code_line">wbuf[0].len = ulHeadLen;</div><div class="code_line">&nbsp;</div><div class="code_line">wbuf[1].buf = const_cast&#60;char*&#62;(pData);</div><div class="code_line">wbuf[1].len = ulLen;</div><div class="code_line">&nbsp;</div><div class="code_line">while (true)</div><div class="code_line">{</div><div class="code_line">if(WSASend(m_apClient-&#62;getSock(), wbuf, 2, &amp;sended, 0, NULL, NULL &nbsp;) &#60; 0)</div><div class="code_line">{</div><div class="code_line">LOG_SOCKET_ERROR(&quot;send failed&quot;);</div><div class="code_line">if(WSAGetLastError() == WSAECONNRESET)</div><div class="code_line">{</div><div class="code_line">m_conn_state = connecting;</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">work_tools::sleep(5);</div><div class="code_line">continue;</div><div class="code_line">}</div><div class="code_line">if(sended &#60; ulHeadLen + ulLen)</div><div class="code_line">LOG( &quot;data loss&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">return true;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#else</div><div class="code_line">send_to_service( pHead, ulHeadLen );</div><div class="code_line">send_to_service( pData, ulLen );</div><div class="code_line">#endif</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#ifndef WIN32</div></ol></div></div></div></div><br>
<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">bool CConnection::send_to_service(const char *pData, unsigned long ulLen)</div><div class="code_line">{</div><div class="code_line">if( !m_apClient )</div><div class="code_line">return false;</div><div class="code_line">&nbsp;</div><div class="code_line">unsigned long total = 0;</div><div class="code_line">int n;</div><div class="code_line">&nbsp;</div><div class="code_line">while(total &#60; ulLen)</div><div class="code_line">{</div><div class="code_line">struct timeval tv;</div><div class="code_line">int retval;</div><div class="code_line">tv.tv_sec = 1;</div><div class="code_line">tv.tv_usec = 0;</div><div class="code_line">fd_set rfds;</div><div class="code_line">FD_ZERO(&amp;rfds);</div><div class="code_line">FD_SET(m_apClient-&#62;getSock(), &amp;rfds);</div><div class="code_line">&nbsp;</div><div class="code_line">retval = select(m_apClient-&#62;getSock() + 1, NULL, &amp;rfds, NULL, &amp;tv);</div><div class="code_line">&nbsp;</div><div class="code_line">if (retval &#62; 0) /// есть дескрипторы, готовые принять данные</div><div class="code_line">{</div><div class="code_line">n = send(m_apClient-&#62;getSock(), pData + total, ulLen - total, MSG_CONFIRM);</div><div class="code_line">if (n == SOCKET_ERROR)</div><div class="code_line">{</div><div class="code_line">if (total &#62; 0)</div><div class="code_line">LOG_ERROR(&quot;send failed on pos&quot; &#60;&#60; total);</div><div class="code_line">&nbsp;</div><div class="code_line">LOG_SOCKET_ERROR(&quot;send failed&quot;);</div><div class="code_line">&nbsp;</div><div class="code_line">if (errno == EWOULDBLOCK)</div><div class="code_line">{</div><div class="code_line">work_tools::sleep(100); /// почему-то всё время заходит сюда</div><div class="code_line">}</div><div class="code_line">if(errno == ECONNRESET)</div><div class="code_line">{</div><div class="code_line">m_conn_state = connecting;</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">}</div><div class="code_line">else</div><div class="code_line">{</div><div class="code_line">total += n;</div><div class="code_line">}</div><div class="code_line">}</div><div class="code_line">if (retval == 0) /// вернули управление по таймауту, дескрипторов нет</div><div class="code_line">{</div><div class="code_line">work_tools::sleep(100);</div><div class="code_line">}</div><div class="code_line">if (retval &#60; 0)</div><div class="code_line">{</div><div class="code_line">if ( errno == EWOULDBLOCK )</div><div class="code_line">{</div><div class="code_line">work_tools::sleep(100);</div><div class="code_line">}</div><div class="code_line">if(errno == ECONNRESET)</div><div class="code_line">{</div><div class="code_line">m_conn_state = connecting;</div><div class="code_line">return false;</div><div class="code_line">}</div><div class="code_line">}</div><div class="code_line">}</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
А теперь суть проблемы. Если код под Windows работает без проблем, то реализация для Linux страдает. Хотя функция select в send_to_service возвращает управление со значением больше 0, при попытке сразу же вызвать send валится исключение EAGAIN. Такое происходит при больших порциях отправляемых данных (например, при попытке отослать 500 Мбайт). В течение минуты сокет дохнет, а ядро шлёт connection timed out, от чего клиент напрочь отваливается. Что делаю не так?]]></description>
        <author>Stuart</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	