С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22

Построить быстрый эхо сервер при приёме и передаче различных по объёму данных от 10 байт до 100 кбайт

02.07.2015, 20:57. Показов 2232. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как построить быстрый эхо сервер.при приёме и передаче различных по объёму данных от 10 байт до 100 кбайт.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.07.2015, 20:57
Ответы с готовыми решениями:

Обеспечить помехоустойчивость при приеме-передаче данных
Делаю приемник сигнала. Сообщение (8 разрядов) подаваемое последовательно на вход (один из пинов) микроконтроллера ATTiny2313, должно...

Прерывание таймером при приёме и передаче данных через UART
Разрабатываю программу для RS485 на базе контроллера STM32F100xx. Ступор настал когда нужно входные и выходные данные прерывать по таймеру...

Шифрование данных при передаче на сервер
Есть задача передать данные на сервер. Получать и отправлять данные будет экзешник, а принимать и обрабатывать PHP файл на хостинге. В...

25
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
03.07.2015, 09:14
Цитата Сообщение от hvt1962 Посмотреть сообщение
Как построить быстрый эхо сервер
взять и построить. как минимум определиться с тем что это за сервер TCP/UDP/XXX??? если нужен вариант по существу: создать сокет, сделать бинд, поставить на прослушивание, селектом проверять наличие запроса на подключение, делать ассепт, селектом проверять наличие входящих данных, принимать их через рецв, отправлять через сенд
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
03.07.2015, 10:05  [ТС]
Да это мне понятно, то что вы написали есть в любом примере по построению клиент- сервер, как чистым сервером (то, что Вы описали), так и через различные библиотеки. Самый простой вопрос к Вам как вы определите окончание приема данных, если работать через буфер?
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
03.07.2015, 10:22
Цитата Сообщение от hvt1962 Посмотреть сообщение
как вы определите окончание приема данных, если работать через буфер?
о каком окончании приема идет речь если вы делаете эхо? пришли 10 байт - отправили 10 байт. пришили 100 кбайт - отправили 100 кбайт. все с колес. никаких буферов. это же эхо. или у вас не просто эхо? тогда конечно нужно знать протокол. из него будет понятно где конец
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
03.07.2015, 10:33  [ТС]
Ну тогда какой размер для recv буфера мне выделять 100 кбайт?

Добавлено через 1 минуту
Вы не путайте, с прокси сервером, пакет пришел перенаправил и все.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
03.07.2015, 10:41
Цитата Сообщение от hvt1962 Посмотреть сообщение
Ну тогда какой размер для recv буфера мне выделять 100 кбайт?
любой. если это действительно эхо. хоть 1 байт. пришел байт "а" эхо послало в ответ "а".
Цитата Сообщение от hvt1962 Посмотреть сообщение
Вы не путайте, с прокси сервером, пакет пришел перенаправил и все.
а тут не все)?
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
03.07.2015, 11:18  [ТС]
я говорю утрировано про прокси. Просто в протоколе TCP реализована разновидность алгоритма квитирования с использованием окна. Поэтому, я думаю, что в момент квитирования, между сервером и клиентом возможно заполнения моего буфера, но тогда встает вопрос, как узнать размер окна.

Добавлено через 3 минуты
как вы перешлете 1 байт при передаче 10 байт по симплексному каналу.

Добавлено через 19 минут
До еще забыл сказать, что максимальный размер сегмента TCP пакета, может быть 64536 байт.) при IPv4.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
03.07.2015, 12:06
Цитата Сообщение от hvt1962 Посмотреть сообщение
разновидность алгоритма квитирования с использованием окна
Цитата Сообщение от hvt1962 Посмотреть сообщение
как вы перешлете 1 байт при передаче 10 байт по симплексному каналу
Цитата Сообщение от hvt1962 Посмотреть сообщение
максимальный размер сегмента TCP пакета, может быть 64536 байт
))) какое все это имеет значение? для вас TCP - это поток байт. прыгнуть выше - значит стать на один уровень с ОС. если знаете как - раскажите. размер окна может быть (точно я этого не знаю) лежит в переменных доступных через getsockopt SO_SNDBUF/SO_RCVBUF
1
 Аватар для SmittWesson
236 / 196 / 21
Регистрация: 04.06.2014
Сообщений: 1,309
03.07.2015, 12:11
Цитата Сообщение от vxg Посмотреть сообщение
прыгнуть выше - значит стать на один уровень с ОС.
Ха-ха-ха, смешно. Компонент Indi юзайте. Он, между прочим, и на вижил студия работает.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
03.07.2015, 12:14
Цитата Сообщение от SmittWesson Посмотреть сообщение
Компонент Indi юзайте
и? он работает не через WinAPI send/recv?
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
03.07.2015, 15:54  [ТС]
Я, когда задавал этот вопрос, подразумевал, что будет предложен эхо сервер на IOCP и все сервера с ним связанные под другие ОС. В связи с чем, изменяю свой вопрос организация эхо сервера на IOCP(ближе к ОС).

Добавлено через 22 минуты
т.е. организация такая, как я себе представляю. есть поток Accept,который передает сокет в поток Read который считывает данные до GetQueuedCompletionStatus() и он передает данные в поток Write. Тогда возникает вопрос, нужен mybufer или достаточно readbufer(для случая получения пакета и отправить в очередь на отправку в потоке Write) для передачи данных и опять, как определить оптимальный размер буфера readbufer.

Добавлено через 1 час 15 минут
В описании TCP протокола сказано "Размер дейтаграммы в байтах с учетом заголовка и данных. Размер поля позволяет использовать дейтаграммы длиной до 65535 байтов, хотя такой размер нежелателен для многих сетей и хостов. Все хосты должны быть готовы к приему дейтаграмм размером до 576 байтов, независимо от того как они доставляются – целиком или фрагментами. Рекомендуется передавать дейтаграммы, размер которых превышает 576 байтов только в тех случаях, когда адресат готов принять такие дейтаграммы." Можно ли считать оптимальным буфером размер в 576 байт.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
03.07.2015, 22:21
Цитата Сообщение от hvt1962 Посмотреть сообщение
В описании TCP протокола сказано "Размер дейтаграммы
TCP + дейтаграммы ?
Кликните здесь для просмотра всего текста



Вот правильно ведь vxg написал выше: TCP - это поток байт.
Никаких там пакетов, дейтаграмм, заголовков и т.п. вы не увидите,
как не пытайтесь.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
04.07.2015, 11:30  [ТС]
Насчёт дейтограммы -это перевод. А как правильно вы считаете называть окно,сегмент.. . просто у нас принято если дейтограмма то это Udp.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.07.2015, 11:48
hvt1962, Вы немного не в ту степь ушли. Сегменты, дейтаграммы...
TCP можно рассматривать как некий сервис, который предоставляет
следующие интерфейсы:

- connect (установка соединения);
- shutdown (закрытие соединения);
- send (отправка данных);
- recv (прием данных)
ну еще listen и accept на серверной стороне.

Это все. Никаких сегментов, плавающих окон, пакетов и т.п. клиенты
этого протокола, т.е. сетевые приложения, работающие с TCP через
данные интерфейсы, не видят.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
04.07.2015, 14:37  [ТС]
А я туда и не лез, я просто задал вопрос про построение эхо сервера(т.к. он просто сервер который принимает и передает без всяких дальнейших наворотов). А после конкретизировал вопрос о размере recvбуфера(SO_SNDBUF/SO_RCVBUF это управление размером дейтограмм) и необходимости использования myбуфера( если данные которые передаются превышают recvбуфер).

Добавлено через 19 минут
Я не правильно выразился SO_SNDBUF/SO_RCVBUF - это не управление размером дейтограмм, а управление приемным/передающим буфером. В некоторых статьях по оптимизации буферов рекомендуют устанавливать приемный буфер 65535 байт, а передающий 576 байт или меньше(тогда начинает работать алгоритм Нейгла).

Добавлено через 28 минут
Но что делать, когда размер сообщения меньше 576 байт ( вроде задержка Нейгла в windows 20 mсек).
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
04.07.2015, 15:58
IMHO, при постановке задачи "как построить быстрый эхо сервер, при приёме и передаче
различных по объёму данных от 10 байт до 100 кбайт" все эти заморочки с алгоритмом
Нейгла, высчитыванием оптимального размера буфера приема и отправки и т.п. не нужны.
Существующие реализации TCP настолько совершенны, что никакой разницы и каких-либо
отклонений от нормы вы при этом тюнинге не почувствуете (если вообще не сделаете хуже).

Эффективность клиент-серверов достигается за счет грамотного распределения нагрузки и
масштабирования, а не установкой флагов или манипуляциями с размерами буферов.

Простой асинхронный сервер с пулом потоков, написанный "на коленке" с использованием, к
примеру, Boost.Asio, уже будет держать приличную нагрузку и не требовать никакой "подгонки".
Уверяю, производительности этой системы для поставленной задачи хватит более чем.

Что касается конкретно реализации эхо-сервера на TCP - мне кажется, задача поставлена
не совсем точно. TCP сам по себе - это поток байт и без знания того, что находится в
этих байтах, вы не можете знать, где кончается один логический кусок данных и
начинается следующий (если только не брать в расчет закрытие или разрыв соединения).
Это в ICMP, например, размер пинг-пакета заранее известен, а в TCP такого нет.

Так что здесь, видимо, читать recv нужно до тех пор, пока не придет 0 (это будет означать
закрытие соединения на том конце) и только после этого отправить данные обратно.
0
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
04.07.2015, 16:55  [ТС]
Я про нагрузку на сервер не чего не говорил. Меня интересует канал связи.Может перед приёмов данных сделать ping клиента(icmp), а потом на основании этих данных использовать буфер.
0
Модератор
 Аватар для vxg
3407 / 2178 / 354
Регистрация: 13.01.2012
Сообщений: 8,448
06.07.2015, 08:21
Лучший ответ Сообщение было отмечено hvt1962 как решение

Решение

Цитата Сообщение от hvt1962 Посмотреть сообщение
я просто задал вопрос
вот тут раскручивают тему в чем-то созвучную вашей. сам почти ничего не понял, но может вас натолкнет на что-нибудь. лично я пребывал в наивной уверенности, что ОС делает возврат из селект сразу же (на сколько это возможно для той технологии которую использует ОС) как только получит данные (любое количество не зависящее от размеров буфера)

Добавлено через 2 минуты
...то есть по статье - как минимум можно копать в сторону равномерной загрузки машины, снижению количества блокировок и вытеснению кода в драйвер
1
0 / 0 / 0
Регистрация: 30.06.2015
Сообщений: 22
06.07.2015, 09:29  [ТС]
vxg, спасибо большое. Теперь хоть направление движения определилось. Буду разбираться.

Добавлено через 37 минут
Для тех кто интересуется, для чего я задал этот вопрос есть хорошая статья http://habrahabr.ru/company/croc/blog/214693/
0
1443 / 1326 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
06.07.2015, 11:38
Там вообще ничего не говорится о среде передачи данных. MTU для того же Ethernet 1500, что собственно больше 576 и меньше 65535. Если произойдет какая та блокировка в положение, то на сокете может оказаться значение больше MTU.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.07.2015, 11:38
Помогаю со студенческими работами здесь

При передаче данных по локальной сети на сервер в базу sql передается только часть данных
Всем доброго времени суток! У меня ситуация такая – есть своя программа на Delphi 2010 для перегонки данных из html-файлов в базу на sql...

STM32F429 теряется байт при приеме по USART1
Организовал обмен информацией через USORT1 <-> ESP8266. Эпизодически ловлю непонятный глюк: в принимаемой контроллером посылке (размером от...

При первой передаче данных на сервер отправляются нулевые данные
Не могу никак реализовать конечный результат, когда нужно получить все данные после редактированного изображение. Сразу скажу что этот...

Access97. При передаче или приеме переменных функциями все русские значения отбражаются кракозяблами
Программа на Access 97 работает с 98 года. Всего около 30 инсталляций на разные виндовсы(95, OSR, 98) -- т.е. в самой программе ошибок нет....

Комментарии к коду эхо-клиент/эхо-сервер
Ребятки ,нужна очень ваша помощь !!! кому не тяжело напишите пожалуйста коментарии к кодам (((код не мой ,но его нужно по заданию...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru