<?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=29784&amp;view=findpost&amp;p=203235</guid>
        <pubDate>Fri, 18 Apr 2003 09:23:38 +0000</pubDate>
        <title>алгоритм работы простого сервера</title>
        <link>https://forum.sources.ru/index.php?showtopic=29784&amp;view=findpost&amp;p=203235</link>
        <description><![CDATA[temik: Спасибо, почти разобрался.<br><br>&gt;&gt;Пример простенького сервера посмотри в этом топе: <br>&gt;&gt;http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=cpp;action=display ;num=1049898059<br>только работает он криво :)]]></description>
        <author>temik</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=29784&amp;view=findpost&amp;p=203234</guid>
        <pubDate>Mon, 14 Apr 2003 06:51:53 +0000</pubDate>
        <title>алгоритм работы простого сервера</title>
        <link>https://forum.sources.ru/index.php?showtopic=29784&amp;view=findpost&amp;p=203234</link>
        <description><![CDATA[old_lamer: Простой сервер TCP достаточно прост :)<br><br>Значит так...<br><br>Прежде всего перед тем как начать работать с сокетами (winsock) надо их инициализировать. Это делается так:<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">&#60;br&#62;WSADATA WSAData;&#60;br&#62;if(WSAStartup(0x0101,&amp;WSAData)){&#60;br&#62;      //Ошибка&#60;br&#62;}&#60;br&#62;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br><br>Певрый параметр это версия сокетов, а второй буфер в которой при успешной инициализации вернётся структура WSADATA.<br><br>Теперь, когда сокеты инициалезированны, можем приступить к следующему шагу - созданию сокета:<br><br><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;br&#62;SOCKET s = socket(AF_INET, SOCK_STREAM,0);&#60;br&#62;</div></ol></div></div></div></div><br><br>Ну а сокет он как и любой сокет имеет ряд свойств, типа протикола, порта, интерфейса и т.д. В принципе при создании сокета уже устанавиваются значения по умолчанию, но мы к нему тем не менее привязуем порт и интервейс с которым он будет работать:<br><br><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;br&#62;sockaddr_in addr;&#60;br&#62;addr.sin_family = AF_INET;      //Семейство протоколов&#60;br&#62;addr.sin_port = htons(7722);      //Порт&#60;br&#62;addr.sin_addr.s_addr=inet_addr(&quot;192.168.100.11&quot;);      //Интерфейс&#60;br&#62;if(bind(s,(LPSOCKADDR)&amp;addr,sizeof(addr)) == SOCKET_ERROR)&#60;br&#62;{&#60;br&#62;      //Ошибка вызова вункции bind()&#60;br&#62;}&#60;br&#62;</div></ol></div></div></div></div><br><br>Мы можем впринципе выбрать любой свободный порт, а можем поручить выбор порта выню, установив значение sin_port равным 0.<br>Функция htons() нам нужна для того чтобы при заполнении структуры числа запсывать в сетевом порядке, т.е. в процах семейства intel числа записываются так: по младшему адресу лежит млачший разряд, а в сетевом порядке всё так-же но в точности наоборот :)<br>Функция inet_addr() переводит строку с IP адрессом интерфейса в его двоичное значение (DWORD), если для нас нет необходимости привязывать сокет к конкретному интерфейсу, то мы заполняем этот член структуры значением INADDR_ANY<br><br>Чтобы получить IP адреса нашего хоста есть несколько полезных функций:<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">&#60;br&#62;char hostname [100];&#60;br&#62;gethostname(hostname,sizeof(hostname)); // Получить имя хоста&#60;br&#62;</div></ol></div></div></div></div><br><br>и<br><br><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;br&#62;gethostbyname(hostname); // Получить указатель на структуру&#60;br&#62;</div></ol></div></div></div></div><br><br>(подробней о структуре хоста поищи в МСДНе или если не найдёш спрашивай (я на память не помню))<br><br>Теперь, можно уже сказать, что сервер почти готов, осталась пара пустяков...<br><br>Так как мы создаём ни что-то там, а сервер, то к нему должны будут подсоединяться клиенты, а значит нам надо создать очередь для соединяющихся клиентов:<br><br><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;br&#62;if(listen(s,5) == SOCKET_ERROR)&#60;br&#62;{&#60;br&#62;      //Ошибка вызова вункции listen()&#60;br&#62;}&#60;br&#62;</div></ol></div></div></div></div><br><br>Ну вот... теперь может находиться в ожидании своей очереди до 5 клиентов.<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">&#60;br&#62;int nAddrLen=sizeof(sockaddr);&#60;br&#62;sockaddr Ot;&#60;br&#62;SOCKET In;&#60;br&#62;In=accept(s,&amp;Ot,&amp;nAddrLen);&#60;br&#62;</div></ol></div></div></div></div><br><br>функция accept() возвращает сокет для работы с клиентом<br>Уже можно начинать сианс связи по установленному протоколу.<br>Т.е. Для нормальной работы сервера и клиента должен быть отработан определённый протокол.<br>Предположим, что наш эхосервер сначала должен получить строку от клиента, а потом отослать ему ответ и закрыть соединение.<br><br>Значит это будет выглядеть так:<br><br><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&#60;br&#62;int nLen;            //Размер полученных/переданных данных&#60;br&#62;char buf[1000];&#60;br&#62;&#60;br&#62;nLen=recv(In,buf,1000,0);&#60;br&#62;if(nLen==0){&#60;br&#62;      //Клиент закрыл соединение&#60;br&#62;}&#60;br&#62;else if(nLen&#60;0){&#60;br&#62;      //Произошла ошибка&#60;br&#62;}&#60;br&#62;esle{&#60;br&#62;      //Всё нормально, данные получены!&#60;br&#62;      //Отослать ответ&#60;br&#62;      nLen=send(In,buf,nLen,0);&#60;br&#62;}&#60;br&#62;&#60;br&#62;shutdown(In,2);&#60;br&#62;closesocket(In);&#60;br&#62;</div></ol></div></div></div></div><br><br><br>Вот в общем тот минмум, который должен помочь в этом деле :)<br><br>Пример простенького сервера посмотри в этом топе:<br>http://pascal.sources.ru/cgi-bin/forum/YaBB.cgi?board=cpp;action=display;num=1049898059<br><br>Будут вопросы, задавай...<br><br><br>P.S. Да!! И чуть не забыл, для работы с winsock надо подключить вот этот заголовок #include &lt;winsock.h&gt;]]></description>
        <author>old_lamer</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=29784&amp;view=findpost&amp;p=203233</guid>
        <pubDate>Fri, 11 Apr 2003 18:01:41 +0000</pubDate>
        <title>алгоритм работы простого сервера</title>
        <link>https://forum.sources.ru/index.php?showtopic=29784&amp;view=findpost&amp;p=203233</link>
        <description><![CDATA[temik: Опишите кто-нибудь сабж. И если можно, примерчик для изучения на C киньте, только без MFC. Протокол &nbsp;TCP желательно.]]></description>
        <author>temik</author>
        <category>C/C++: Сетевое программирование</category>
      </item>
	
      </channel>
      </rss>
	