<?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=132612&amp;view=findpost&amp;p=1017391</guid>
        <pubDate>Wed, 15 Feb 2006 13:27:25 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1017391</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>LuckLess</strong><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>а под nix-ами другой результат будет?</div></div><br>
Не думаю - ведь send() - это юниксовая функция<br>
Просто портирована в Windows]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1017154</guid>
        <pubDate>Wed, 15 Feb 2006 10:15:35 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1017154</link>
        <description><![CDATA[LuckLess: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1016481'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>sham6215 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-14T14:07:36+00:00">14.02.06, 14:07</time></span><div class='quote '>Я проверял снифером прогу (которая является прототипом того, что делаю я) и увидел, что буфер разбивается на части. По-этому и затеял всё с разбивкой буфера. А когда стал передавать буфер целиком, то результат получился такой же, как в программе-прототипе (снифер показал, что моё сообщение отправляется несколькими пакетами) и исчезли ошибки.</div></div><br>
хорошо что отписал.<br>
а то у меня все времени небыло проверить))).<br>
<br>
<strong class='tag-b'>Oleg2004</strong><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1016687'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-14T17:54:42+00:00">14.02.06, 17:54</time></span><div class='quote '>Если больше чем 1460б - тогда send() из своего буфера - цельного - сам, без вашей помощи, нарезает куски нужной длины и отдает в буфер модуля TCP</div></div><br>
а под nix-ами другой результат будет?]]></description>
        <author>LuckLess</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1017108</guid>
        <pubDate>Wed, 15 Feb 2006 09:28:32 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1017108</link>
        <description><![CDATA[sham6215: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1016687'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-14T17:54:42+00:00">14.02.06, 17:54</time></span><div class='quote '>Она сама это прекрасно знает - что вы думаете, ее ламеры делали???</div></div><br>
 :no: , нет, просто не знал, что:<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1016687'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-14T17:54:42+00:00">14.02.06, 17:54</time></span><div class='quote '>Если больше чем 1460б - тогда send() из своего буфера - цельного - сам, без вашей помощи, нарезает куски нужной длины и отдает в буфер модуля TCP</div></div><br>
<br>
Спасибо, за исчерпывающее объяснение.]]></description>
        <author>sham6215</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1016687</guid>
        <pubDate>Tue, 14 Feb 2006 17:54:42 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1016687</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>sham6215</strong><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>А когда стал передавать буфер целиком, то результат получился такой же, как в программе-прототипе (снифер показал, что моё сообщение отправляется несколькими пакетами) и исчезли ошибки.</div></div><br>
Что и требовалось доказать :yes: <br>
Если ваш TCP-сегмент меньше чем 1460 байт - все уйдет в одном IP- пакете - если вы находитесь в сети Ethernet - все зависит от MTU сети.<br>
Если больше чем 1460б - тогда send() из своего буфера - цельного - сам, без вашей помощи, нарезает куски нужной длины и отдает в буфер модуля TCP<br>
Вы должны точно себе представлять - буфер send() - сам по себе - это буфер программы пользовательского уровня<br>
А буфер TCP - это буфер системный, и на него можно влиять только через setsockopt()<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Значит ли это, что в Windows следует отказываться от send в пользу WSASend?</div></div> <br>
Cовсем не значит. send() прекрасно работает в Windows.<br>
WSASend() имеет просто несколько важных преимуществ, первое из которых - это асинхронная функция, а второе - больше параметров - значит возможностей.<br>
А также надо иметь в виду, что в Windows 6 моделей сетевого ввода/вывода, и для некоторых можно работать только с WSASend() - например модель с перекрытием overlapped I/O (или ее самый мощный вариант - completion port) - вы запускаете на одном сокете несколько WSASend() <strong class='tag-b'>одновременно</strong>.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>message - буфер, shift - количество байт уже переданных. (message + shift) - адрес, с которого следует считывать данные. Тут, ИМХО, всё нормально.</div></div><br>
Тут как раз ненормально :yes: <br>
Вы пытаетесь в функции send() реализовать ее-же функциональность - подсказать send(), откуда надо работать - нонсенс.<br>
Она сама это прекрасно знает - что вы думаете, ее ламеры делали??? :wacko:]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1016481</guid>
        <pubDate>Tue, 14 Feb 2006 14:07:36 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1016481</link>
        <description><![CDATA[sham6215: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1015346'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>LuckLess &#064; <time class="tag-quote__quoted-time" datetime="2006-02-13T14:57:20+00:00">13.02.06, 14:57</time></span><div class='quote '>зависит от используемого протокола..<br>
какой сокет у тебя? </div></div><br>
<br>
Обычный блокирующий сокет. Протокол TCP (SOCK_STREAM).<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1015379'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-13T15:33:03+00:00">13.02.06, 15:33</time></span><div class='quote '>В Windows - это WSASend() + надо заказывать winsock 2.0</div></div><br>
Значит ли это, что в Windows следует отказываться от send в пользу WSASend?<br>
<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1015390'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>LuckLess &#064; <time class="tag-quote__quoted-time" datetime="2006-02-13T15:39:54+00:00">13.02.06, 15:39</time></span><div class='quote '>а разве для connection-orientied протоколов send() автоматом большой буфер на части не разложит?</div></div><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1015398'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-13T15:48:15+00:00">13.02.06, 15:48</time></span><div class='quote '>Думаю нет - у него руки связаны.</div></div><br>
<br>
Я проверял снифером прогу (которая является прототипом того, что делаю я) и увидел, что буфер разбивается на части. По-этому и затеял всё с разбивкой буфера. А когда стал передавать буфер целиком, то результат получился такой же, как в программе-прототипе (снифер показал, что моё сообщение отправляется несколькими пакетами) и исчезли ошибки.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=132612&view=findpost&p=1015398'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2006-02-13T15:48:15+00:00">13.02.06, 15:48</time></span><div class='quote '>А тут (message + shift) - я не могу точно сказать, как это будет интерпретироваться</div></div><br>
message - буфер, shift - количество байт уже переданных. (message + shift) - адрес, с которого следует считывать данные. Тут, ИМХО, всё нормально.]]></description>
        <author>sham6215</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015400</guid>
        <pubDate>Mon, 13 Feb 2006 15:51:21 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015400</link>
        <description><![CDATA[LuckLess: <strong class='tag-b'>Oleg2004</strong><br>
странно тогда что пишут <br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
For message-oriented sockets<br>
</div></div><br>
<br>
вечерком попробую...]]></description>
        <author>LuckLess</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015398</guid>
        <pubDate>Mon, 13 Feb 2006 15:48:15 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015398</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>LuckLess</strong><br>
Думаю нет - у него руки связаны.<br>
Он должен как чурка переслать все что в его буфере - в буфер TCP - и он это делает &quot;своими&quot; частями - указывает наверно индекс и &quot;ползет по памяти&quot; и тд - но никогда не разбивает.<br>
За сколько времени - ему тоже все равно, и возвратит управление только тогда, когда все отослано.<br>
А -1 - это только чисто при ошибке, и проверка тут на длину я думаю ничего полезного не даст.<br>
А тут (message + shift) - я не могу точно сказать, как это будет интерпретироваться]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015390</guid>
        <pubDate>Mon, 13 Feb 2006 15:39:54 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015390</link>
        <description><![CDATA[LuckLess: <strong class='tag-b'>Oleg2004</strong><br>
а разве для connection-orientied протоколов send() автоматом большой буфер на части не разложит?]]></description>
        <author>LuckLess</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015379</guid>
        <pubDate>Mon, 13 Feb 2006 15:33:03 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015379</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>sham6215</strong><br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>а если у меня буфер большой</div></div><br>
send()  и будет &quot;висеть&quot;, пока все не передаст<br>
Согласно Стивенсу:<br>
&quot;Когда приложение вызывает функцию write()[читай send()], ядро копирует данные из буфера приложения в буфер отправки сокета. Если для всех данных приложения недостаточно места в буфере сокета (либо буфер приложения больше буфера отправки сокета, либо в буфере отправки сокета уже имеются данные), этот процесс приостанавливается (переходит в состояние ожидания - те висит.) Подразумевается, что мы используем обычный блокируемый сокет&quot;<br>
Мне почему то кажется, что ваша проблема в (message + shift)<br>
Для разбивки буфера на две и более частей в Unix используют writev()<br>
В Windows - это WSASend() + надо заказывать winsock 2.0]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015346</guid>
        <pubDate>Mon, 13 Feb 2006 14:57:20 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015346</link>
        <description><![CDATA[LuckLess: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>For message-oriented sockets, care must be taken not to exceed the maximum packet size of the underlying provider, which can be obtained by using getsockopt to retrieve the value of socket option SO_MAX_MSG_SIZE. If the data is too long to pass atomically through the underlying protocol, the error WSAEMSGSIZE is returned, and no data is transmitted.</div></div><br>
<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="2006-02-13T14:58:56+00:00">13.02.06, 14:58</time></span></span><br>
<span class="tag-color tag-color-named" data-value="gray" style="color: gray">форум чтото подвисает...</span>]]></description>
        <author>LuckLess</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015291</guid>
        <pubDate>Mon, 13 Feb 2006 13:15:59 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015291</link>
        <description><![CDATA[sham6215: <strong class='tag-b'>Ace</strong>, ок, спасибо. У меня кстати, недавно возникал вопрос, зачем вообще нужен FD_WRITE :) . Теперь ясно.<br>
<br>
<strong class='tag-b'>LuckLess</strong>, а если у меня буфер боьшой - несколько мегабайт, то всё равно передавать в send весь буфер и всё будет ок?<br>
<br>
Я проверил. Всё замечательно бьётся и WSAEWOULDBLOCK перестал появляться.]]></description>
        <author>sham6215</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015254</guid>
        <pubDate>Mon, 13 Feb 2006 12:46:38 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015254</link>
        <description><![CDATA[LuckLess: а зачем ты отправляешь буффер кусками?<br>Отправляй все сразу , стек сам разобъет пакет на нужное число..]]></description>
        <author>LuckLess</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015250</guid>
        <pubDate>Mon, 13 Feb 2006 12:41:05 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015250</link>
        <description><![CDATA[Ace: Чаше всего такое происходит, когда принимающая сторона не успевает считывать данные. Либо переходи на асинхр. работу с сокетами и с удобствами FD_WRITE для таких затыков. Либо придумывай таймаут на всю операцию отсылки, и в случае блокирования сокета пытайся отправлять до истечения этого таймаута. Причем, учитывай ещё один не маловажный момент - в мсдн есть предупреждение, что в случае НЕ успеха операции send (истечение сокетного таймаута), состояние сокета становится НЕ предсказуемым и дальнейшая работа с ним НЕ рекомендуется  :)]]></description>
        <author>Ace</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015127</guid>
        <pubDate>Mon, 13 Feb 2006 10:33:55 +0000</pubDate>
        <title>Ошибка сокета: WSAEWOULDBLOCK</title>
        <link>https://forum.sources.ru/index.php?showtopic=132612&amp;view=findpost&amp;p=1015127</link>
        <description><![CDATA[sham6215: Добрый день.<br>
<br>
Возникла такая проблема: я создаю обычный блокирующий сокет и пытаюсь передать в цикле буфер message:<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">int shift = 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;sending_len = 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;sent_count = 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;msg_len = 0,</div><div class="code_line">&nbsp;&nbsp; &nbsp;err_code = 0;</div><div class="code_line">BYTE message[MESSAGE_LEN] = {0};</div><div class="code_line">&nbsp;</div><div class="code_line">//составление message и получение msg_len</div><div class="code_line">..............</div><div class="code_line">&nbsp;</div><div class="code_line">while(shift &#60; msg_len) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(shift + SENDING_SUBPART_SIZE &#60; msg_len)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sending_len = SENDING_SUBPART_SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;else</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;sending_len = msg_len - shift;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;sent_count = send(sock, (char*)(message + shift), sending_len, 0);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if( sent_count != sending_len ){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;err_code = WSAGetLastError();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Sleep(100);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;continue;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;shift += sending_len;</div><div class="code_line">}</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
Цикл, вообщем, отрабатывает, но довольно часто send возвращает -1, а WSAGetLastError - WSAEWOULDBLOCK.<br>
В МСДНе пишут:<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>A non-blocking socket operation could not be completed immediately.</div></div><br>
Но как избавиться от ошибки я так и не понял. Если кто-нибудь встречался с подобным, подскажите пожалуйста, как избавиться.<br>
--------------------------------<br>
WinXP, VS .NET]]></description>
        <author>sham6215</author>
        <category>C/C++: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	