<?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=411739&amp;view=findpost&amp;p=3755698</guid>
        <pubDate>Wed, 10 Jan 2018 20:10:52 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3755698</link>
        <description><![CDATA[linuxoid: Закрыто]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754158</guid>
        <pubDate>Thu, 21 Dec 2017 08:10:53 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754158</link>
        <description><![CDATA[linuxoid: Всем большое спасибо за помощь, я разобрался с проблемой. Да, вы все были правы, данные действительно приходят все, не знаю почему, но мне казалось, что идет потеря, т.к. я не мог получить любой символ после &#092;0 и думал, что проблема в том что отправка идет именно char *. Сейчас немного изменил код и заметил, что байты приходят все, сейчас буду инкапсулировать в класс. Сглупил немного, но хорошо, что все-таки благодаря вашей помощи я нашел ошибку. Тема закрыта.]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754074</guid>
        <pubDate>Wed, 20 Dec 2017 14:20:02 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754074</link>
        <description><![CDATA[VisualProg: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754065'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:57:59+00:00">20.12.17, 13:57</time></span><div class='quote '>функция эта ничего не передает, а лишь копирует байты из своего буфера в буфер передачи сокета.</div></div><br>
<br>
<strong class='tag-b'>linuxoid</strong>, вот чтобы всё это было прозрачно, вам надо понять как работает этот пример:<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">typedef struct Test {</div><div class="code_line">&nbsp;int a; // + 4 байта</div><div class="code_line">&nbsp;int b; // + 4 байта</div><div class="code_line">&nbsp;int c; // + 4 байта</div><div class="code_line">&nbsp;int d; // + 4 байта</div><div class="code_line">} Test; // + n байт выравнивания полей структуры и того, sizeof минимум 16 байт</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
А вот, мы представляем этот блок в виде char* элементов:<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">Test data;</div><div class="code_line">char *dataToBytes = (char*)(&amp;data);</div><div class="code_line">&nbsp;</div><div class="code_line">for(int i=sizeof(Test)-1;i&#62;=0;i--){</div><div class="code_line">&nbsp;std::cout&#60;&#60;std::to_string(dataToBytes[i])&#60;&#60;&quot; &quot;;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
По вашему, Test был текстом? А может он превратиться в текст? Нет конечно) Обычный низкий уровень - мы просто разобрали блок данных на конкретные байты. И вот, это произошло, как раз, потому что <strong class='tag-b'>любой</strong> (подчёркиваю, ЛЮБОЙ) блок данных можно прочитать через char* указатель.]]></description>
        <author>VisualProg</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754069</guid>
        <pubDate>Wed, 20 Dec 2017 14:04:27 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754069</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754048'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:08:35+00:00">20.12.17, 13:08</time></span><div class='quote '>Я просто пытаюсь понять для себя, как передать строку char * (ибо перегрузки, например, для void * у функции send() не существует) и не потерять данные, следующие после первого терминатора &#092;0.</div></div><br>
<strong class='tag-b'>linuxoid</strong>, особенности приёма/передачи заключаются в том, <br>
что передаваемые данные могут быть переданы почти любыми по размеру несколькими порциями.<br>
Не обязательно может быть получена такая-же (одна) порция, которая передана функции &quot;send&quot;.<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><br>
Как-то раз я обнаружил, на приёмной стороне была принята <br>
промежуточная часть общего сообщения длиной... 14 байт.<br>
Тем не менее, всё сообщение целиком было получено правильно и <br>
без искажений. <br>
</div></div><br>
-----<br>
Поэтому, определив общий размер сообщения по заголовку, надо<br>
дождаться приёма всех данных целиком. <br>
Если это не удаётся, разрывать соединение по T-OUT-у.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754068</guid>
        <pubDate>Wed, 20 Dec 2017 14:02:37 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754068</link>
        <description><![CDATA[Oleg2004: <strong class='tag-b'>VisualProg</strong> :)  :yes:]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754066</guid>
        <pubDate>Wed, 20 Dec 2017 13:58:04 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754066</link>
        <description><![CDATA[VisualProg: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754048'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:08:35+00:00">20.12.17, 13:08</time></span><div class='quote '>(ибо перегрузки, например, для void * у функции send() не существует) и не потерять данные, следующие после первого терминатора &#092;0. ведь так или иначе в ОС Windows передача происходит именно char*</div></div><br>
Опять глупость. send не может ничего терять. В винде, ровно как и в линухе всё одинаково с send функциями.<br>
<br>
Читайте что вам говорили ранее - char* это byte*. Просто из коробки есть char*, а для byte/bool/BYTE и прочих типов требуется что нибудь подключить. Никто не скажет слова против, если вы сделаете передачу byte*. Send отработает, более того, сделает это правильно. Почему - я уже описал выше.<br>
<br>
<div class="tag-spoiler spoiler closed"><div class="spoiler_header" onclick="openCloseParent(this)">Скрытый текст</div><div class="body"><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754065'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:57:59+00:00">20.12.17, 13:57</time></span><div class='quote '>Настоящий прототип send() из стандарта сокетов Беркли:<br>
int send(int sd, const void *buf, int buflen, unsigned int flags); </div></div><br>
И во внутренностях, этот void* представляется блоком, который приводится к char* и считывается по 1 байту. А то автор опять подумает что ему нужен void*  :) </div></div>]]></description>
        <author>VisualProg</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754065</guid>
        <pubDate>Wed, 20 Dec 2017 13:57:59 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754065</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754048'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:08:35+00:00">20.12.17, 13:08</time></span><div class='quote '>Мне кажется, что проблема в следующем, в прототипе функции send() указано, что она передает массив char *, </div></div><br>
Назовите мне источник этой дезинформации :)<br>
что она передает массив текстовых данных...<br>
Настоящий прототип send() из стандарта сокетов Беркли:<br>
int send(int sd, const void *buf, int buflen, unsigned int flags); <br>
Как я уже писал, функция эта ничего не передает, а лишь копирует байты из своего буфера в буфер передачи сокета.<br>
В сетевой терминологии по сети передаются последовательности байтов. Но в С/C++ нет типа byte. Поэтому  char’у приходится брать на себя роль byte; с его помощью в прототипе просто указывается единица информации - 8-ми битный байт. Т.е. наличие в прототипе char никак не свидетельствует о том, что передаются текстовые данные.  :)]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754062</guid>
        <pubDate>Wed, 20 Dec 2017 13:52:44 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754062</link>
        <description><![CDATA[VisualProg: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3754048'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-20T13:08:35+00:00">20.12.17, 13:08</time></span><div class='quote '>Мне кажется, что проблема в следующем, в прототипе функции send() указано, что она передает массив char *, перегрузки этой функция для, например, void * не существует. Так вот, на мой взгляд, проблема в том, что функция send() перед передачей информации их буфера, обрезает его до первого терминатора строки &#092;0 и то, что было после него не передается </div></div><br>
Ещё раз, обратите внимание на то я писал.<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753884'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>VisualProg &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:44:46+00:00">19.12.17, 07:44</time></span><div class='quote '>4. В сокете используется char*, но, это никак не связанные со строками указатели. Такой char* может вообще не содержать терминаторов и текстовых символов, и сокет будет успешно его передавать. Почему? Потому что вы указываете offset откуда начинать передачу, и size - количество блоков и length - длину блока. Сама передающая функция оперирует только данными в &quot;массиве&quot; размеры которого вы указываете при отправлении.</div></div><br>
Никаких терминаторов никто не смотрит. Идёт слепое копирование блока памяти.<br>
<br>
Перегрузка void* говорила бы о том, что единицей информации мог выступать любой объект. char* же, говорит о том что роль единицы информации играет 1 байт. Не нужен там void*.]]></description>
        <author>VisualProg</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754048</guid>
        <pubDate>Wed, 20 Dec 2017 13:08:35 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3754048</link>
        <description><![CDATA[linuxoid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753943'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T16:38:25+00:00">19.12.17, 16:38</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>Грешил тоже, что использую str* (использовал их потому что <strong class='tag-b'>функция send передает char * и только его</strong>) заменил на mem*, но суть остается все той же. </div></div><br>
Странно.<br>
Как это понимать - &quot;char * и только его&quot;???<br>
Функция send() предает содержимое своего буфера.<br>
А точнее, send() ничего никуда не передает - она просто <strong class='tag-b'>копирует содержимое</strong> своего буфера в буфер передачи сокета.<br>
Что в буфере - функцию совершенно не волнует. 8 бит каждого байта. И что представляют собой эти биты - функции по барабану.<br>
Иначе бы у нас не было сети ваще... :no:</div></div><br>
Мне кажется, что проблема в следующем, в прототипе функции send() указано, что она передает массив char *, перегрузки этой функция для, например, void * не существует. Так вот, на мой взгляд, проблема в том, что функция send() перед передачей информации их буфера, обрезает его до первого терминатора строки &#092;0 и то, что было после него не передается <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2017-12-20T13:15:32+00:00">20.12.17, 13:15</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753913'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T09:45:34+00:00">19.12.17, 09:45</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>Ну или проще говоря, как мне передать любое изображение при помощи сокетов без подключения сторонних библиотек. Хотелось бы организовать такую передачу самому</div></div><br>
Значит, надо разработать свой протокол поверх TCP.<br>
Очевидно, сообщение будет состоять из заголовка и данных, организованных<br>
определённым образом.<br>
&quot;Протокол&quot; лучше оформить классом. Класс будет заниматься созданием/разборкой пакетов.<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">//----------------------------------------------------------------------------------</div><div class="code_line">// формат пакета- передачи файла и перемещение в указанную директорию</div><div class="code_line">// offset &nbsp;параметр &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; размер &nbsp; &nbsp; &nbsp;примечание</div><div class="code_line">// ............................................. заголовок, 16 байт</div><div class="code_line">// 0000 &nbsp; &nbsp;SIG_HEAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WORD &nbsp; &nbsp; &nbsp;сигнатура заголовка </div><div class="code_line">// 0002 &nbsp; &nbsp;VER_MAJOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0003 &nbsp; &nbsp;VER_MINOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0004 &nbsp; &nbsp;SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; размер сообщения в байтах включая заголовок</div><div class="code_line">// 0008 &nbsp; &nbsp;SYSTEM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; сообщения относятся к системе xx-mm</div><div class="code_line">// 0009 &nbsp; &nbsp;TIPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; тип данных (назначение сообщения) = SEND_FILE_TO_DIR</div><div class="code_line">// 000A &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD &nbsp; &nbsp; &nbsp; </div><div class="code_line">// 000C &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// 000E &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// ............................................. тело сообщения - переменное число байт</div><div class="code_line">// 0010 &nbsp; &nbsp;SIZE_FILE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; размер файла</div><div class="code_line">// 0014 &nbsp; &nbsp;OFFSET_DATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; смещение данных пакета от-но начала файла</div><div class="code_line">// 0018 &nbsp; &nbsp;POTION &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; номер части с 1(передаём файл, порубленный на части)</div><div class="code_line">// 001С &nbsp; &nbsp;POTIONS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; всего частей &nbsp; (передаём файл, порубленный на части)</div><div class="code_line">// 0020 &nbsp; &nbsp;POTION_SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; размер части &nbsp; (передаём файл, порубленный на части)</div><div class="code_line">// 0024 &nbsp; &nbsp;parameter &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; некоторые биты - параметры для возможных доп. действий </div><div class="code_line">// 0028 &nbsp; &nbsp;имя директории &nbsp; &nbsp; &nbsp; UCHARxK &nbsp; имя директории, оканчивающееся 0 (если имя состоит только из одного 0 - директория на усмотрение приёмника)</div><div class="code_line">// xxxx &nbsp; &nbsp;имя файла &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHARxL &nbsp; имя файла, оканчивающееся 0 (если имя состоит только из одного 0 - имя файла на усмотрение приёмника)</div><div class="code_line">// xxxx &nbsp; &nbsp;FILE_DATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHARxM &nbsp; данные файла</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">// формат пакета - ответ на запрос пересылки файла в указанную директорию</div><div class="code_line">// offset &nbsp;параметр &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; размер &nbsp; &nbsp; &nbsp;примечание</div><div class="code_line">// ............................................. заголовок, 16 байт</div><div class="code_line">// 0000 &nbsp; &nbsp;SIG_HEAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WORD &nbsp; &nbsp; &nbsp;сигнатура заголовка </div><div class="code_line">// 0002 &nbsp; &nbsp;VER_MAJOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0003 &nbsp; &nbsp;VER_MINOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0004 &nbsp; &nbsp;SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; размер сообщения в байтах включая заголовок</div><div class="code_line">// 0008 &nbsp; &nbsp;SYSTEM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; сообщения относятся к системе xx-mm</div><div class="code_line">// 0009 &nbsp; &nbsp;TIPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; тип данных (назначение сообщения) = ANS_SEND_FILE_TO_DIR</div><div class="code_line">// 000A &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD &nbsp; &nbsp; &nbsp;</div><div class="code_line">// 000C &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// 000E &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// ............................................. тело сообщения - переменное число байт</div><div class="code_line">// 0010 &nbsp; &nbsp;RETURN OP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; код возрата операции (0 - OK)</div><div class="code_line">// 0014 &nbsp; &nbsp;ERROR CODE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; код ошибки </div><div class="code_line">//----------------------------------------------------------------------------------</div></ol></div></div></div></div> <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="2017-12-19T09:51:28+00:00">19.12.17, 09:51</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>На Хосте А у меня формируется сообщение, к примеру, = &quot;ver33&#092;0vdv4&#092;0,hjmk,&#092;0fsdf&#092;0&#092;svdf&#092;0sf23453dfg&#092;0&#092;0&#092;0fghfgh&#092;0&quot;;<br>
Отправляю его на Хост B при помощи функции send() и на хост B приходит сообщение = &quot;ver33&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;&#092;0&#092;0&#092;0&#092;0&#092;0&quot;<br>
 любое изображение при помощи сокетов без подключения сторонних библиотек. Хотелось бы организовать такую передачу самому</div></div><br>
используй сниффер.<br>
посмотри передаваемые пакеты, тогда станет понятно, где ошибка - у клиента, сервера<br>
и вообще что происходит.</div></div><br>
Хорошо, спасибо, я понял вашу идею по организации передачи файла и инкапсуляции данных в некий класс, но я не разрабатываю приложение, которым потом будут пользоваться, я просто пытаюсь понять суть проблемы. При передачи простого текста, без инкапсуляции его в класс, все передается без потерь и прочего(да, я понимаю, что это не показатель и что в какой-то момент времени на какой-то машине может быть сбой при передаче и я это никак не отслеживаю), но пытаюсь передать тем же способом любой файл: изображение, видео, документ; то происходит потеря, которая, как мне кажется, заключается в том, о чем я говорил в сообщении выше. Я просто пытаюсь понять для себя, как передать строку char * (ибо перегрузки, например, для void * у функции send() не существует) и не потерять данные, следующие после первого терминатора &#092;0. ведь так или иначе в ОС Windows передача происходит именно char*. Может мне стоит использовать какую-либо сериализацию/десериализацию, преобразование буфера перед передачей и так далее. Спасибо всем за помощь]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753943</guid>
        <pubDate>Tue, 19 Dec 2017 16:38:25 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753943</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>Грешил тоже, что использую str* (использовал их потому что <strong class='tag-b'>функция send передает char * и только его</strong>) заменил на mem*, но суть остается все той же. </div></div><br>
Странно.<br>
Как это понимать - &quot;char * и только его&quot;???<br>
Функция send() предает содержимое своего буфера.<br>
А точнее, send() ничего никуда не передает - она просто <strong class='tag-b'>копирует содержимое</strong> своего буфера в буфер передачи сокета.<br>
Что в буфере - функцию совершенно не волнует. 8 бит каждого байта. И что представляют собой эти биты - функции по барабану.<br>
Иначе бы у нас не было сети ваще... :no:]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753913</guid>
        <pubDate>Tue, 19 Dec 2017 09:45:34 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753913</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>Ну или проще говоря, как мне передать любое изображение при помощи сокетов без подключения сторонних библиотек. Хотелось бы организовать такую передачу самому</div></div><br>
Значит, надо разработать свой протокол поверх TCP.<br>
Очевидно, сообщение будет состоять из заголовка и данных, организованных<br>
определённым образом.<br>
&quot;Протокол&quot; лучше оформить классом. Класс будет заниматься созданием/разборкой пакетов.<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">//----------------------------------------------------------------------------------</div><div class="code_line">// формат пакета- передачи файла и перемещение в указанную директорию</div><div class="code_line">// offset &nbsp;параметр &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; размер &nbsp; &nbsp; &nbsp;примечание</div><div class="code_line">// ............................................. заголовок, 16 байт</div><div class="code_line">// 0000 &nbsp; &nbsp;SIG_HEAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WORD &nbsp; &nbsp; &nbsp;сигнатура заголовка </div><div class="code_line">// 0002 &nbsp; &nbsp;VER_MAJOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0003 &nbsp; &nbsp;VER_MINOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0004 &nbsp; &nbsp;SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; размер сообщения в байтах включая заголовок</div><div class="code_line">// 0008 &nbsp; &nbsp;SYSTEM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; сообщения относятся к системе xx-mm</div><div class="code_line">// 0009 &nbsp; &nbsp;TIPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; тип данных (назначение сообщения) = SEND_FILE_TO_DIR</div><div class="code_line">// 000A &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD &nbsp; &nbsp; &nbsp; </div><div class="code_line">// 000C &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// 000E &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// ............................................. тело сообщения - переменное число байт</div><div class="code_line">// 0010 &nbsp; &nbsp;SIZE_FILE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; размер файла</div><div class="code_line">// 0014 &nbsp; &nbsp;OFFSET_DATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; смещение данных пакета от-но начала файла</div><div class="code_line">// 0018 &nbsp; &nbsp;POTION &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; номер части с 1(передаём файл, порубленный на части)</div><div class="code_line">// 001С &nbsp; &nbsp;POTIONS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; всего частей &nbsp; (передаём файл, порубленный на части)</div><div class="code_line">// 0020 &nbsp; &nbsp;POTION_SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; размер части &nbsp; (передаём файл, порубленный на части)</div><div class="code_line">// 0024 &nbsp; &nbsp;parameter &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; некоторые биты - параметры для возможных доп. действий </div><div class="code_line">// 0028 &nbsp; &nbsp;имя директории &nbsp; &nbsp; &nbsp; UCHARxK &nbsp; имя директории, оканчивающееся 0 (если имя состоит только из одного 0 - директория на усмотрение приёмника)</div><div class="code_line">// xxxx &nbsp; &nbsp;имя файла &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHARxL &nbsp; имя файла, оканчивающееся 0 (если имя состоит только из одного 0 - имя файла на усмотрение приёмника)</div><div class="code_line">// xxxx &nbsp; &nbsp;FILE_DATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHARxM &nbsp; данные файла</div><div class="code_line">//----------------------------------------------------------------------------------</div><div class="code_line">// формат пакета - ответ на запрос пересылки файла в указанную директорию</div><div class="code_line">// offset &nbsp;параметр &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; размер &nbsp; &nbsp; &nbsp;примечание</div><div class="code_line">// ............................................. заголовок, 16 байт</div><div class="code_line">// 0000 &nbsp; &nbsp;SIG_HEAD &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WORD &nbsp; &nbsp; &nbsp;сигнатура заголовка </div><div class="code_line">// 0002 &nbsp; &nbsp;VER_MAJOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0003 &nbsp; &nbsp;VER_MINOR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;UCHAR &nbsp; &nbsp; версия протокола &nbsp; &nbsp;</div><div class="code_line">// 0004 &nbsp; &nbsp;SIZE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; размер сообщения в байтах включая заголовок</div><div class="code_line">// 0008 &nbsp; &nbsp;SYSTEM &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; сообщения относятся к системе xx-mm</div><div class="code_line">// 0009 &nbsp; &nbsp;TIPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UCHAR &nbsp; &nbsp; тип данных (назначение сообщения) = ANS_SEND_FILE_TO_DIR</div><div class="code_line">// 000A &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD &nbsp; &nbsp; &nbsp;</div><div class="code_line">// 000C &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// 000E &nbsp; &nbsp;RESERVE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;WORD</div><div class="code_line">// ............................................. тело сообщения - переменное число байт</div><div class="code_line">// 0010 &nbsp; &nbsp;RETURN OP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD &nbsp; &nbsp; код возрата операции (0 - OK)</div><div class="code_line">// 0014 &nbsp; &nbsp;ERROR CODE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DWORD &nbsp; &nbsp; код ошибки </div><div class="code_line">//----------------------------------------------------------------------------------</div></ol></div></div></div></div> <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="2017-12-19T09:51:28+00:00">19.12.17, 09:51</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753876'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T07:03:56+00:00">19.12.17, 07:03</time></span><div class='quote '>На Хосте А у меня формируется сообщение, к примеру, = &quot;ver33&#092;0vdv4&#092;0,hjmk,&#092;0fsdf&#092;0&#092;svdf&#092;0sf23453dfg&#092;0&#092;0&#092;0fghfgh&#092;0&quot;;<br>
Отправляю его на Хост B при помощи функции send() и на хост B приходит сообщение = &quot;ver33&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;&#092;0&#092;0&#092;0&#092;0&#092;0&quot;<br>
 любое изображение при помощи сокетов без подключения сторонних библиотек. Хотелось бы организовать такую передачу самому</div></div><br>
используй сниффер.<br>
посмотри передаваемые пакеты, тогда станет понятно, где ошибка - у клиента, сервера<br>
и вообще что происходит.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753884</guid>
        <pubDate>Tue, 19 Dec 2017 07:44:46 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753884</link>
        <description><![CDATA[VisualProg: 1. Создайте нормальный блок данных. Можно использовать структуру (путь сей), или класс (путь плюсов):<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; &nbsp;class Data {</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;private:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char &nbsp;*data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t size;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;public:</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Data(char *data, size_t size);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;~Data();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;char &nbsp;*getData();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;size_t getSize();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Data::Data(char *data, size_t size){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;data=data;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;size=size;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;~Data(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;free(this-&#62;data);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *Data::getData(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this-&#62;data;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;size_t Data::getSize(){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return this-&#62;size;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div></ol></div></div></div></div><br>
<br>
2. Сделайте удобный доступ к данным, как вариант, удобный лично мне:<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">typedef std::shared_ptr&#60;Data&#62; TCPData;</div></ol></div></div></div></div><br>
<br>
3. По нормальному оберните ваш сокет, чтобы можно было с ним работать, и каждая его часть была прозрачной. Прикрепляю часть своего кроссплатформенного костыля, для наглядности:<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">#pragma once</div><div class="code_line">#include &#60;string&#62;</div><div class="code_line">#include &#60;iostream&#62;</div><div class="code_line">#include &#60;stdio.h&#62;</div><div class="code_line">#include &#60;stdlib.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef __linux__</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;netinet/in.h&#62;</div><div class="code_line">#include &#60;sys/types.h&#62;</div><div class="code_line">#include &#60;sys/socket.h&#62;</div><div class="code_line">#include &#60;unistd.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#if defined(_WIN32) || defined(_WIN64)</div><div class="code_line">&nbsp;</div><div class="code_line">#include &#60;io.h&#62;</div><div class="code_line">#include &#60;winsock2.h&#62;</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Protocol {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;class Socket {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;private:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int port;</div><div class="code_line">&nbsp;</div><div class="code_line">#ifdef __linux__</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int socketConnect;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int listener;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;struct sockaddr_in address;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">#if defined(_WIN32) || defined(_WIN64)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WSADATA wsa;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;SOCKET s, new_socket;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;struct sockaddr_in server, client;</div><div class="code_line">#endif</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;public:</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Socket(unsigned int port);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;~Socket();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TCPData readData();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void sendData(TCPData data);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void open();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;void disconnect();</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;};</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#if defined(_WIN32) || defined(_WIN64)</div><div class="code_line">&nbsp;</div><div class="code_line">#include&#60;io.h&#62;</div><div class="code_line">#include&#60;stdio.h&#62;</div><div class="code_line">#include&#60;winsock2.h&#62;</div><div class="code_line">#pragma comment(lib,&quot;ws2_32.lib&quot;)</div><div class="code_line">&nbsp;</div><div class="code_line">#define BUFF_SIZE 4096</div><div class="code_line">&nbsp;</div><div class="code_line">namespace Protocol {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Socket::Socket(unsigned int port) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;port = port;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Socket::open() {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Debug::Debug &#60;&#60; &quot;Инициализация Winsock...\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (WSAStartup(MAKEWORD(2, 2), &amp;this-&#62;wsa) != 0) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Debug::Error &#60;&#60; &quot;Ошибка. Error Code: &quot; &#60;&#60; WSAGetLastError() &#60;&#60; &quot;\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit(1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Debug::Debug &#60;&#60; &quot;Создание соккета...\n&quot;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if ((s = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Debug::Error &#60;&#60; &quot;Не удалось создать сокет: &quot; &#60;&#60; WSAGetLastError() &#60;&#60; &quot;\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;exit(2);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;server.sin_family = AF_INET;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;server.sin_addr.s_addr = INADDR_ANY;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;server.sin_port = htons(this-&#62;port);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;for(;;){</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;bool err = false;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (bind(this-&#62;s, (struct sockaddr *)&amp;this-&#62;server, sizeof(this-&#62;server)) == SOCKET_ERROR) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Debug::Error &#60;&#60; &quot;Bind failed with error code: &quot; &#60;&#60; WSAGetLastError() &#60;&#60; &quot;\n&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//exit(EXIT_FAILURE);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Sleep(200L);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;err = true;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if(!err){</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;listen(this-&#62;s, 3);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;int c = sizeof(struct sockaddr_in);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;this-&#62;new_socket = accept(this-&#62;s,(struct sockaddr *)&amp;this-&#62;client, &amp;c);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;bool readyToReceive(SOCKET sock, int interval = 1) {</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;fd_set fds;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FD_ZERO(&amp;fds);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FD_SET(sock, &amp;fds);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;timeval tv;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tv.tv_sec = interval;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tv.tv_usec = 0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return (select(sock + 1, &amp;fds, 0, 0, &amp;tv) == 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;TCPData Socket::readData() {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;... // &#60;--- Здесь ваш код</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Socket::sendData(TCPData data){</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;... // &#60;--- Здесь ваш код</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;void Socket::disconnect() {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;closesocket(this-&#62;s);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WSACleanup();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Socket::~Socket(void) {</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;disconnect();</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;</div><div class="code_line">}</div><div class="code_line">&nbsp;</div><div class="code_line">#endif</div></ol></div></div></div></div><br>
<br>
4. В сокете используется char*, но, это никак не связанные со строками указатели. Такой char* может вообще не содержать терминаторов и текстовых символов, и сокет будет успешно его передавать. Почему? Потому что вы указываете offset откуда начинать передачу, и size - количество блоков и length - длину блока. Сама передающая функция оперирует только данными в &quot;массиве&quot; размеры которого вы указываете при отправлении.<br>
<br>
<br>
Если вы повторите то что я вам предложил, вы сами отметёте проблему с сокетом и определитесь была ли в нём ошибка, или это, всё таки, виноваты преобразования на уровне строк.]]></description>
        <author>VisualProg</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753876</guid>
        <pubDate>Tue, 19 Dec 2017 07:03:56 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753876</link>
        <description><![CDATA[linuxoid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753871'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T05:06:17+00:00">19.12.17, 05:06</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753868'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T04:36:59+00:00">19.12.17, 04:36</time></span><div class='quote '>приходят данные только до NULL - символа</div></div><br>
<br>
1) Забыть про все функции, начинающияе с <strong class='tag-b'>str*</strong>&#33; Заменить их на на соответствующие реализации с <strong class='tag-b'>mem*</strong><br>
2) Забыть про терминатор <strong class='tag-b'>%</strong>&#33; А если он - часть передаваемых данных? <br>
<br>
Лучше предусмотреть контроль длины передаваемых данных иным способом. <br>
Например. Сперва передается длина, которая &quot;расшифровывается&quot; следующим образом:<br>
a) Переданный первый байт меньше или равен 0x0F - указывает длину последующих передаваемых данных явно своим значением<br>
б) Переданный первый байт равен 0x1F - указывает что второй байт так же указывает длину, и длина равна 0x1F+значение 2-го байта<br>
в) Переданный первый байт равен 0x2F - указывает что второй и третий байт так же указывает длину, и длина равна 0x1F+uint16(значение 2-го и 3-го) байта<br>
... и т.д.<br>
<br>
Тогда контроль длины переданного и полученного не будет зависеть от &quot;внутренностей&quot; передаваемого. По желанию - можно еще передавать контрольную сумму сразу после длины. Ну это уже все зависит от фантазии.<br>
<br>
А так, не мудрено, что не работает.</div></div><br>
&quot;%&quot; использовал на скорую руку, далее я бы сделал все примерно так, как вы описываете. Но проблема возникает на этом этапе.<br>
На Хосте А у меня формируется сообщение, к примеру, = &quot;ver33&#092;0vdv4&#092;0,hjmk,&#092;0fsdf&#092;0&#092;svdf&#092;0sf23453dfg&#092;0&#092;0&#092;0fghfgh&#092;0&quot;;<br>
Отправляю его на Хост B при помощи функции send() и на хост B приходит сообщение = &quot;ver33&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;0&#092;&#092;0&#092;0&#092;0&#092;0&#092;0&quot;<br>
<br>
Грешил тоже, что использую str* (использовал их потому что функция send передает char * и только его) заменил на mem*, но суть остается все той же. <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="2017-12-19T07:12:26+00:00">19.12.17, 07:12</time></span></span><br>
Ну или проще говоря, как мне передать любое изображение при помощи сокетов без подключения сторонних библиотек. Хотелось бы организовать такую передачу самому]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753871</guid>
        <pubDate>Tue, 19 Dec 2017 05:06:17 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753871</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753868'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-19T04:36:59+00:00">19.12.17, 04:36</time></span><div class='quote '>приходят данные только до NULL - символа</div></div><br>
<br>
1) Забыть про все функции, начинающияе с <strong class='tag-b'>str*</strong>&#33; Заменить их на на соответствующие реализации с <strong class='tag-b'>mem*</strong><br>
2) Забыть про терминатор <strong class='tag-b'>%</strong>&#33; А если он - часть передаваемых данных? <br>
<br>
Лучше предусмотреть контроль длины передаваемых данных иным способом. <br>
Например. Сперва передается длина, которая &quot;расшифровывается&quot; следующим образом:<br>
a) Переданный первый байт меньше или равен 0x0F - указывает длину последующих передаваемых данных явно своим значением<br>
б) Переданный первый байт равен 0x1F - указывает что второй байт так же указывает длину, и длина равна 0x1F+значение 2-го байта<br>
в) Переданный первый байт равен 0x2F - указывает что второй и третий байт так же указывает длину, и длина равна 0x1F+uint16(значение 2-го и 3-го) байта<br>
... и т.д.<br>
<br>
Тогда контроль длины переданного и полученного не будет зависеть от &quot;внутренностей&quot; передаваемого. По желанию - можно еще передавать контрольную сумму сразу после длины. Ну это уже все зависит от фантазии.<br>
<br>
А так, не мудрено, что не работает.]]></description>
        <author>JoeUser</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753868</guid>
        <pubDate>Tue, 19 Dec 2017 04:36:59 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753868</link>
        <description><![CDATA[linuxoid: Попробовал я копировать в свой буфер путем memcpy() и результат остался прежним. Посмотрел что считывается с сокета на стороне получателя и там приходят данные только до NULL - символа. Приходит обрезанное сообщение]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753627</guid>
        <pubDate>Sat, 16 Dec 2017 21:37:56 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753627</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753625'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2017-12-16T21:21:15+00:00">16.12.17, 21:21</time></span><div class='quote '>т.к. он относится к т.н. &quot;контролю перегрузок&quot;, этот механизм лежит гораздо ниже уровня работы программы ТС</div></div><br>
Мы наверно про разное. :) <br>
Да только RFC 3168 - CWR (Congestion Window Reduced) — Поле «Окно перегрузки уменьшено»<br>
и<br>
ECE (ECN-Echo) — Поле «Эхо ECN» <br>
к алгоритму Нэйгла не относится.<br>
Впрочем, у ТС могут быть и свои заморочки, о которых он просто умалчивает. Так с ним уже было в одной недавней теме.  :( <br>
А что до вашего приложения, то там наверно TCP_NODELAY установлен. Или реализация стека TCP/IP не Rеnо и не Vegas и уже подправлено :) <br>
Потому что приложения типа rlogin уже сейчас практически не используются.<br>
Ну не суть...ждем ТС :)]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753625</guid>
        <pubDate>Sat, 16 Dec 2017 21:21:15 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753625</link>
        <description><![CDATA[Gonarh: Проблема явно не в плоскости описанного рфц, т.к. он относится к т.н. &quot;контролю перегрузок&quot;, этот механизм лежит гораздо ниже уровня работы программы ТС, и никак на него не влияет. У меня клиент-серверное приложение обменивается пакетами до 200 байт, всё работает нормально, ничего не теряется.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753595</guid>
        <pubDate>Sat, 16 Dec 2017 16:16:34 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753595</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753575'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-16T14:00:54+00:00">16.12.17, 14:00</time></span><div class='quote '>У меня размер буфера составляет 256 байт, кажется, что 256 байт за один раз функция send сможет послать, поэтому не проверяю на то ушли все данные или нет. </div></div><br>
Что то мне это напоминает эту ситуацию:<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '>Маленькие пакеты (называемые тиниграммами, от английского tiny – крошечный, маленький) – обычно не проблема для локальных сетей, так как большинство локальных сетей не перегружаются, однако они могут привести к перегрузке глобальной сети. В RFC 896 Джон Нейгл (John Nagle,1984), предложил свое решение этой проблемы, которое называется алгоритмом Нейгла (Nagle algorithm). <br>
Из алгоритма следует, что в TCP-соединении может присутствовать только один исходящий &quot;маленький&quot; сегмент, который еще не был подтвержден.<br>
<strong class='tag-b'>Модуль TCP относит к &quot;маленьким&quot; все пакеты, чей размер меньше MSS.</strong> Следующие подобные сегменты могут быть посланы только после того, как было получено подтверждение. Поэтому, вместо того, чтобы отправить их сразу, малые порции данных накапливаются в буфере передачи и отправляются одним TCP-сегментом, лишь когда прибывает подтверждение на первый пакет. Алгоритм получается самонастраивающимся: чем быстрее придет подтверждение, тем быстрее будут отправлены данные. В результате в медленных глобальных сетях, где необходимо уменьшить количество небольших пакетов, отправляется меньше сегментов. <br>
..............<br>
Вывод может быть сделан следующий: если по каким-то причинам в сеть посылаются небольшие пакеты, то отключение алгоритма приведет к заполнению сети этими пакетами; если же алгоритм включен, количество пакетов резко уменьшается, но время суммарной доставки данных увеличивается. По умолчанию в модуле TCP алгоритм Nagle включен.<br>
</div></div><br>
Посмотрите свой MSS и поймете что файлик в 256 байтов это уже меньше чем MSS]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753575</guid>
        <pubDate>Sat, 16 Dec 2017 14:00:54 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753575</link>
        <description><![CDATA[linuxoid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753451'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T10:02:05+00:00">15.12.17, 10:02</time></span><div class='quote '>Вот это уже вызывает подозрения:<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; &nbsp; &nbsp; ReceivedBytes = send(hSock,buffer,++dwRead,NULL); //Отправляю блок данных с терминатором конца сообщения в конце блока</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (dwRead != ReceivedBytes) //Проверка на успешную отправку</div></ol></div></div></div></div><br>
<a class='tag-url' href='https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx' target='_blank'>Пример send</a><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; &nbsp;iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (iResult == SOCKET_ERROR) {</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">&nbsp;if (dwRead != ReceivedBytes)</div></ol></div></div></div></div><br>
Это не ошибка. <br>
Так может быть: dwRead &gt;= ReceivedBytes<br>
В этом случае надо проверять, сколько передано и остаток &quot;досылать&quot;.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Return value<br>
<br>
If no error occurs, <strong class='tag-b'>send returns the total number of bytes sent, which can be less than the number requested <br>
to be sent</strong> in the len parameter. <br>
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.<br>
<br>
</div></div>char * это и есть байтовый массив. У тебя проблема в том, что ты используешь strcat(buffer,tmp), а надо что то типа memcpy(buffer, tmp, ReceivedBytes). А лучше используй std::vector&lt;char&gt; </div></div><br>
У меня размер буфера составляет 256 байт, кажется, что 256 байт за один раз функция send сможет послать, поэтому не проверяю на то ушли все данные или нет. <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="2017-12-16T14:03:39+00:00">16.12.17, 14:03</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753448'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Олег М &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T09:00:53+00:00">15.12.17, 09:00</time></span><div class='quote '><div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753418'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T02:23:40+00:00">15.12.17, 02:23</time></span><div class='quote '>Именно это я и хочу, но recv() принимает только массив char *. Может вы подскажите аналогичную функцию, работающую с массивом байт</div></div><br>
<br>
char * это и есть байтовый массив. У тебя проблема в том, что ты используешь  strcat(buffer,tmp), а надо что то типа memcpy(buffer, tmp,  ReceivedBytes). А лучше используй std::vector&lt;char&gt;</div></div><br>
Идея хорошая, не обратил внимание, что использую strcat. Лучше использовать, как вы и предложили, memcpy(). Попробую это и о результате сообщу, но что-то мне подсказывает, что это решение проблемы]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753465</guid>
        <pubDate>Fri, 15 Dec 2017 11:27:30 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753465</link>
        <description><![CDATA[Oleg2004: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753458'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>ЫукпШ &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T10:51:12+00:00">15.12.17, 10:51</time></span><div class='quote '>Но при этом ограничение размера массива переданных<br>
байт всё равно остаётся, не растёт и существенно меньше размера буфера.<br>
Возможно, это баг, но ждать когда его исправят просто глупо.</div></div><br>
Да, странная ситуация.<br>
Тогда контроль - по старинке -  :) надежнее.]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753458</guid>
        <pubDate>Fri, 15 Dec 2017 10:51:12 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753458</link>
        <description><![CDATA[ЫукпШ: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753452'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Oleg2004 &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T10:13:16+00:00">15.12.17, 10:13</time></span><div class='quote '>Если большие, то есть смысл увеличить размер буфера передачи сокета.</div></div><br>
Удивительно, но в последней версии Fedora, буфер передачи<br>
можно увеличить. Но при этом ограничение размера массива переданных<br>
байт всё равно остаётся, не растёт и существенно меньше размера буфера. <br>
Возможно, это баг, но ждать когда его исправят просто глупо.<br>
Надёжнее контролировать число переданных байт.]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753452</guid>
        <pubDate>Fri, 15 Dec 2017 10:13:16 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753452</link>
        <description><![CDATA[Oleg2004: Какой размер передаваемых данных?<br>От этого много зависит.<br>Если файлы небольшие, то есть смысл отключить алгоритм Нагла.<br>Если большие, то есть смысл увеличить размер буфера передачи сокета.]]></description>
        <author>Oleg2004</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753451</guid>
        <pubDate>Fri, 15 Dec 2017 10:02:05 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753451</link>
        <description><![CDATA[ЫукпШ: Вот это уже вызывает подозрения:<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; &nbsp; &nbsp; ReceivedBytes = send(hSock,buffer,++dwRead,NULL); //Отправляю блок данных с терминатором конца сообщения в конце блока</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (dwRead != ReceivedBytes) //Проверка на успешную отправку</div></ol></div></div></div></div><br>
<a class='tag-url' href='https://msdn.microsoft.com/en-us/library/windows/desktop/ms740149(v=vs.85).aspx' target='_blank'>Пример send</a><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; &nbsp;iResult = send( ConnectSocket, sendbuf, (int)strlen(sendbuf), 0 );</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (iResult == SOCKET_ERROR) {</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">&nbsp;if (dwRead != ReceivedBytes)</div></ol></div></div></div></div><br>
Это не ошибка. <br>
Так может быть: dwRead &gt;= ReceivedBytes<br>
В этом случае надо проверять, сколько передано и остаток &quot;досылать&quot;.<br>
<div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><br>
Return value<br>
<br>
If no error occurs, <strong class='tag-b'>send returns the total number of bytes sent, which can be less than the number requested <br>
to be sent</strong> in the len parameter. <br>
Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.<br>
<br>
</div></div>]]></description>
        <author>ЫукпШ</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753448</guid>
        <pubDate>Fri, 15 Dec 2017 09:00:53 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753448</link>
        <description><![CDATA[Олег М: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753418'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>linuxoid &#064; <time class="tag-quote__quoted-time" datetime="2017-12-15T02:23:40+00:00">15.12.17, 02:23</time></span><div class='quote '>Именно это я и хочу, но recv() принимает только массив char *. Может вы подскажите аналогичную функцию, работающую с массивом байт</div></div><br>
<br>
char * это и есть байтовый массив. У тебя проблема в том, что ты используешь  strcat(buffer,tmp), а надо что то типа memcpy(buffer, tmp,  ReceivedBytes). А лучше используй std::vector&lt;char&gt;]]></description>
        <author>Олег М</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753418</guid>
        <pubDate>Fri, 15 Dec 2017 02:23:40 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753418</link>
        <description><![CDATA[linuxoid: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=411739&view=findpost&p=3753370'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2017-12-14T16:27:50+00:00">14.12.17, 16:27</time></span><div class='quote '>Принимай не чары, а байты.</div></div><br>
Именно это я и хочу, но recv() принимает только массив char *. Может вы подскажите аналогичную функцию, работающую с массивом байт]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753370</guid>
        <pubDate>Thu, 14 Dec 2017 16:27:50 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753370</link>
        <description><![CDATA[Gonarh: Принимай не чары, а байты.]]></description>
        <author>Gonarh</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753297</guid>
        <pubDate>Thu, 14 Dec 2017 09:22:19 +0000</pubDate>
        <title>Передача данных в локальной сети</title>
        <link>https://forum.sources.ru/index.php?showtopic=411739&amp;view=findpost&amp;p=3753297</link>
        <description><![CDATA[linuxoid: Всем привет. Делаю небольшое приложение для передачи файла по локальной сети использую WinSock2. Суть проблемы в том, что текстовые файлы(.txt) передаются без каких-либо проблем.<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">WSADATA _WSA;</div><div class="code_line">WSAStartup(MAKEWORD(2,2),&amp;_WSA);</div><div class="code_line">SOCKET hSock = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);</div><div class="code_line">if (hSock == INVALID_SOCKET)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;cout&#60;&#60;&quot;Error: &quot;&#60;&#60; GetLastError()&#60;&#60;endl;</div><div class="code_line">&nbsp;&nbsp; &nbsp;system(&quot;pause&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;return 0;</div><div class="code_line">}</div><div class="code_line">...</div><div class="code_line">closesocket(hSock);</div><div class="code_line">WSACleanup();</div><div class="code_line">system(&quot;pause&quot;);</div><div class="code_line">return 0;</div></ol></div></div></div></div><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 SendDateTo(const char *path, SOCKET hSock) &nbsp;//path - путь до файла</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buffer[MAX_SIZE]; </div><div class="code_line">&nbsp;&nbsp; &nbsp;int ReceivedBytes, buff_size=MAX_SIZE;</div><div class="code_line">&nbsp;&nbsp; &nbsp;char * t = getNamefromPath(path); //Выделяю из пути только имя файла, чтобы передать его адресату, для создания файла с тем же именем и расширением.</div><div class="code_line">&nbsp;&nbsp; &nbsp;HANDLE hFile = CreateFileA(path,GENERIC_READ,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); //открытие файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (hFile==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can`t open file&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;LARGE_INTEGER FileSize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;GetFileSizeEx(hFile,&amp;FileSize); //Получение размера файла в байтах</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(t, &quot;%&quot;); &nbsp;//Знак &#39;%&#39; означает окончание сообщения, передаваемого по сети</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Сделано для того, что не всегда recv у адресата принимает сразу все данные, которые были отправлены</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //С помощью этого знака я сообщаю что сообщение окончено</div><div class="code_line">&nbsp;&nbsp; &nbsp;buff_size = strlen(t); </div><div class="code_line">&nbsp;&nbsp; &nbsp;ReceivedBytes = send(hSock,t,buff_size,NULL); &nbsp; //Отправляю адресату имя файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (ReceivedBytes !=buff_size) &nbsp; //Проверка на успешную отправку.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Exception&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReceivedBytes = recvdata(hSock,buffer,MAX_SIZE); &nbsp;//recvdata() функция-оболочка для recv, которая получает сообщение целиком и помещаешь его в buffer</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (strcmp(GOOD,buffer)!=0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can&#39;t get GOOD signal&quot;; &nbsp;//Сигнал о том, что адресат получил сообщение и готов принимать следущее</div><div class="code_line">&nbsp;&nbsp; &nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while(FileSize.QuadPart&#62;0) &nbsp;//Передавать файл, пока его размер &#62; 0</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;DWORD dwRead;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReadFile(hFile,buffer,MAX_SIZE-1,&amp;dwRead,NULL); //Читаю блок данных размеров MAX_SIZE - 1</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;FileSize.QuadPart -= dwRead; //Уменьшаю размер файла на число прочитанных байт</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;buffer[dwRead] = &#39;%&#39;; //Помещаю в конец строки терминатор сообщения</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReceivedBytes = send(hSock,buffer,++dwRead,NULL); //Отправляю блок данных с терминатором конца сообщения в конце блока</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (dwRead != ReceivedBytes) //Проверка на успешную отправку</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can&#39;t send message&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;ReceivedBytes=recvdata(hSock,buffer,MAX_SIZE); //Примем сообщения об успешной доставке</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (strcmp(GOOD,buffer)!=0) &nbsp;//Если сообщение не было успешно доставлено - исключение</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw &quot;Can&#39;t get GOOD signal&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buffer,END_OF_SESSION);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(buffer, &quot;%&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;buff_size = strlen(buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ReceivedBytes = send(hSock,buffer,buff_size,NULL); &nbsp;//Отправляю адресату сообщение об окончании сеанса передачи данных.</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hFile);</div><div class="code_line">}</div></ol></div></div></div></div><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 GetDataFrom(const char * DirPath, SOCKET hSock) //DirPath - директория сохранения файла</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;char buffer[MAX_SIZE];</div><div class="code_line">&nbsp;&nbsp; &nbsp;int Recervefbytes, boffer_size=MAX_SIZE; &nbsp;//Буфер для передачи данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;Recervefbytes=recvdata(hSock, buffer, boffer_size); //Ждем от отправителя имя файла</div><div class="code_line">&nbsp;&nbsp; &nbsp;char * tmp = new char[strlen(DirPath) + Recervefbytes];</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(tmp, DirPath);</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(tmp, buffer);</div><div class="code_line">&nbsp;&nbsp; &nbsp;//Конкатенируем строки директории и имени файла и создаем файл</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;//То, что файл уже существует пока не обрабатывается, идет простая перезапись</div><div class="code_line">&nbsp;&nbsp; &nbsp;HANDLE hFile = CreateFileA(tmp,GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (hFile==INVALID_HANDLE_VALUE)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can`t create file&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcpy(buffer, GOOD);</div><div class="code_line">&nbsp;&nbsp; &nbsp;boffer_size = strlen(buffer) + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;strcat(buffer,&quot;%&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Recervefbytes = send(hSock,buffer,boffer_size, NULL); //Отправляем сигнал о том, что файл создан и мы готовы принимать данные.</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(Recervefbytes != boffer_size) &nbsp;//Проверка на успешно отправленное сообщение</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can&#39;t send data&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while (true)</div><div class="code_line">&nbsp;&nbsp; &nbsp;{</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DWORD dwRead;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Recervefbytes=recvdata(hSock, buffer,MAX_SIZE - 1); &nbsp;//Принимаем блок данных</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (strcmp(buffer, END_OF_SESSION)==0) &nbsp;//Если сообщение = окончанию сессии - выходим из цикла</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;break;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;WriteFile(hFile,buffer,Recervefbytes,&amp;dwRead,NULL); &nbsp;//Записываем полученный блок данных в файл</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;strcpy(buffer, GOOD);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;strcat(buffer,&quot;%&quot;);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Recervefbytes = send(hSock, buffer, strlen(buffer), NULL); //Отправляем сообщение о готовности принять следующий блок данных</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if(Recervefbytes != strlen(buffer))</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;throw &quot;Can&#39;t send data&quot;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;}</div><div class="code_line">&nbsp;&nbsp; &nbsp;delete tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;CloseHandle(hFile);</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Функция recvdata()<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">DWORD recvdata(SOCKET hs,char *buffer, int buff_size)</div><div class="code_line">{</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(hs == INVALID_SOCKET) &nbsp;//Проверка аргументов</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return -1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if(buff_size &#60;=0)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;buffer[0] = &#39;{text}&#39;; &nbsp;//Обрезание буфера</div><div class="code_line">&nbsp;&nbsp; &nbsp;char *tmp = new char[buff_size]; //Создаем временную переменную для приема данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;int true_size = 0, ReceivedBytes;</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;ReceivedBytes=recv(hs,tmp,buff_size,NULL); //Принимаем часть данных</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;tmp[ReceivedBytes] = &#39;{text}&#39;; //Помещаем терминатор в конец</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;if (ReceivedBytes &#60;= 0) &nbsp;//В случае ошибки приёма - выходим</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return -3;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;true_size += ReceivedBytes; &nbsp;//true_size хранит фактическое количество принятых байт</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;strcat(buffer,tmp); //конкатенируем часть данных с буфером</div><div class="code_line">&nbsp;&nbsp; &nbsp;}while(tmp[ReceivedBytes-1] !=&#39;%&#39;); //Если в конце сообщения находится терминатор сообщения - выход из цикла</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//Иначе прием еще порции данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;buffer[true_size - 1] = &#39;{text}&#39;; //Терминатор в конец полученного блока данных</div><div class="code_line">&nbsp;&nbsp; &nbsp;delete tmp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;return true_size;</div><div class="code_line">}</div></ol></div></div></div></div><br>
<br>
Проблема в том, что если я передаю, например, изображение то в нем могут содержаться спец.символы вроде NULL<br>
Так как передача осуществляется блока типа char *, то строка из файла вида <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">IHDR[NULL][NULL][STX]|[BS][STX]JEKKSE32[NULL]4cИL...</div></ol></div></div></div></div><br>
<br>
Обрезается до первого символа NULL, т.е. &quot;IHDR&quot;.<br>
Считывается из файла информация при помощи ReadFile() полностью, все MAX_SIZE символов, т.е. за первым NULL лежат правильные символы, просто char * дальше NULL ничего не видит<br>
При записи в файл у адресата наблюдается то, что после первого символа NULL в строке ничего нет.<br>
Либо строка обрезается до первого NULL в самой функции recv, либо я что-то делаю не так. Прошу помочь мне в этом разобраться<br>
<br>
Пытался найти функцию, которая передает не массив char *, а массив void *, но такой функции в Windows нет, а в UNIX существует.]]></description>
        <author>linuxoid</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	