-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
1

Boost Asio - последовательность сообщений для одного и того же TCP Сокета

08.02.2025, 15:23. Показов 2640. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,

Подскажите пожалуйста, по такому вопросу:

-предположим я создал один TCP сокет Boost Asio

-установил на нем соединение с удаленным IP

-отправил первое сообщение

- и не закрывая сокета и соединения сразу же НЕ ДОЖИДАЯСЬ того, что все данные первого сообщения будут отправлены(по крайней мере в условный сетвевой драйвер) - НА ЭТОМ ЖЕ Сокете(на этом же соединении) вызвал async_write/async_write_some для второго сообщения.

-Меня интересует гарантия того, что второе сообщение из второго вызова async_write/async_write_some НА ОНОМ И ТОМ ЖЕ сокете Гарантировано будет отправлено только после полной отправки первого сообщения из первого вызова async_write/async_write_some.

Это гарантируется или нет ?

PS:Мнение LLM`ок разделилось, поэтому я решил еще спросить и Людей
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.02.2025, 15:23
Ответы с готовыми решениями:

Boost asio повторное открытие сокета
Добрый день. Такая проблема, что открываю сокет после запуска, и все идеально: принимаю ,большое количество пакетов и те, которые...

Проблема в TCP сервере на boost asio со страндами
Добрый день! Прошу помочь в решении проблемы (( Я написал простой TCP чат сервер. Все работает так, как задумал. После того,...

boost::asio::ip::tcp::resolver::close() - проблемы
Есть код клиента. Выложу только значащие моменты. Проблема заключается в следующем - при асинхронном резолве, если интернет выключен и...

9
Любитель чаепитий
 Аватар для GbaLog-
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,018
Записей в блоге: 1
11.02.2025, 12:27 2
с точки зрения протокола у пакетов tcp есть sequence number, который позволяет посылать пакеты вне какой-то очереди и потом пересобирать их в нужном порядке на удалённом узле
с точки зрения ОС в этом нет никакого смысла, там, вероятнее всего, очередь данных

то есть, с формальной точки зрения это не обязательно
с точки зрения практической скорее всего гарантируется
0
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
11.02.2025, 13:51 3
Когда вы вызываете async_write или async_write_some, операция асинхронна, и управление возвращается сразу. Однако TCP гарантирует, что данные будут отправлены в порядке их поступления. Ваша программа может инициировать несколько операций записи, но TCP будет обрабатывать их в порядке завершения.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
11.02.2025, 15:15  [ТС] 4
Цитата Сообщение от andrey_f Посмотреть сообщение
Когда вы вызываете async_write или async_write_some, операция асинхронна, и управление возвращается сразу. Однако TCP гарантирует, что данные будут отправлены в порядке их поступления. Ваша программа может инициировать несколько операций записи, но TCP будет обрабатывать их в порядке завершения.
TCP возможно и гарантирует, практика показла, что Boost Asio не гарантирует и нужно делать свой механизм последовтаельности вызова async_write_some, пока редыдущая отправка полностью не завершится.
0
 Аватар для andrey_f
596 / 379 / 184
Регистрация: 21.02.2011
Сообщений: 5,130
12.02.2025, 13:02 5
Когда вы вызываете async_write, выполнение не блокируется, и управление возвращается немедленно. Это означает, что если вы вызываете async_write для второго сообщения, прежде чем завершится передача первого, это не приведет к нарушению порядка на уровне TCP.
Цитата Сообщение от Optimus11 Посмотреть сообщение
нужно делать свой механизм последовтаельности вызова async_write_some, пока редыдущая отправка полностью не завершится.
Один из способов сделать это — использовать обработчики завершения (completion handlers) для отслеживания статуса операций записи.
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
12.02.2025, 15:36  [ТС] 6
Цитата Сообщение от andrey_f Посмотреть сообщение
Когда вы вызываете async_write, выполнение не блокируется, и управление возвращается немедленно. Это означает, что если вы вызываете async_write для второго сообщения, прежде чем завершится передача первого, это не приведет к нарушению порядка на уровне TCP.
Как написал выше, на деле - если вы вызовете async_write_some для отправки 1 Гб и сразу же вызовете async_write_some для второго сообщения, то на приемной стороне байты из двух сообщеия придут перемешанные.

Цитата Сообщение от andrey_f Посмотреть сообщение
Один из способов сделать это — использовать обработчики завершения (completion handlers) для отслеживания статуса операций записи.
Да я уже сделал.
0
87 / 87 / 18
Регистрация: 11.06.2018
Сообщений: 302
12.02.2025, 19:28 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
если вы вызовете async_write_some для отправки 1 Гб и сразу же вызовете async_write_some для второго сообщения, то на приемной стороне байты из двух сообщеия придут перемешанные.
Дык доки нужно читать, потому что. До TCP тут вообще дело не дошло.
One or more data buffers to be written to the socket. Although the buffers object may be copied as necessary, ownership of the underlying memory blocks is retained by the caller, which must guarantee that they remain valid until the completion handler is called.
https://live.boost.org/doc/lib... _some.html
0
13.02.2025, 08:16 8
 Комментарий модератора 
ablex, Optimus11, прекратите перебранку и переход на личности, в противном случае по отношению к Вашим персонам будут применены дисциплинарные меры.
0
Любитель чаепитий
 Аватар для GbaLog-
3744 / 1800 / 566
Регистрация: 24.08.2014
Сообщений: 6,018
Записей в блоге: 1
14.02.2025, 07:40 9
Цитата Сообщение от Optimus11 Посмотреть сообщение
если вы вызовете async_write_some для отправки 1 Гб
то в обработчик придёт результат о том, что в сокет записалось меньше данных, чем 1 Гб, и необходимо повторить операцию для остального буфера
и, естественно, если в очереди есть другой async_write_some, то он выполнится сразу за первым и запишет свои данные (от второго сообщения)
тут не логика TCP/IP или Boost.Asio нарушена, а программная логика
если нужно, чтобы послался 1 Гб и потом послалось второе сообщение, нужно это логически организовывать
например, посылать через async_write, который гарантирует, что все данные из буфера будут посланы
0
-41 / 49 / 5
Регистрация: 10.01.2017
Сообщений: 1,915
14.02.2025, 10:20  [ТС] 10
Цитата Сообщение от GbaLog- Посмотреть сообщение
то в обработчик придёт результат о том, что в сокет записалось меньше данных, чем 1 Гб, и необходимо повторить операцию для остального буфера
и, естественно, если в очереди есть другой async_write_some, то он выполнится сразу за первым и запишет свои данные (от второго сообщения)
тут не логика TCP/IP или Boost.Asio нарушена, а программная логика
если нужно, чтобы послался 1 Гб и потом послалось второе сообщение, нужно это логически организовывать
например, посылать через async_write, который гарантирует, что все данные из буфера будут посланы
Да я уже сделал.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.02.2025, 10:20
Помогаю со студенческими работами здесь

Является ли boost::asio::tcp::acceptor потоко-безопасным ?
Мне сложно понять смысл того что написано в документации: ...

boost::asio::ip::tcp::socket::async_connect не вызывает handler
Пытаюсь подключиться к серверу: void CTcpClient::Connect( const std::string & IpAddress_, int Port_ ) { IpAddress = IpAddress_; ...

Boost asio завершить работу асинхронного TCP сервера
Здравствуйте друзья. Столкнулся с проблемой завершения работы TCP сервера по команде "stop". Взял код с github, чуток поправил,...

Ошибка в boost::asio::ip::tcp::iostream stream (&request);
Только приступаю к изучению boost::asio, не судите строго. Программа вычитывает картинку и записывает ее (пока что) в текстовый файл ...

Как узнать число активных соединений в boost::asio::ip::tcp::acceptor ?
Можно конечно и самому завести счётчик, но хочется сделать более профессиональное решение, если такое возможно. Раз мы можем ограничить...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

Новые блоги и статьи
Java Micronaut в Docker: контейнеризация с Maven и Jib
Javaican 16.03.2025
Когда речь заходит о микросервисной архитектуре на Java, фреймворк Micronaut выделяется среди конкурентов. Он создан с учётом особенностей облачных сред и контейнеров, что делает его идеальным. . .
Управление зависимостями в Java: Сравнение Spring, Guice и Dagger 2
Javaican 16.03.2025
Инъекция зависимостей (Dependency Injection, DI) — один из фундаментальных паттернов проектирования, который радикально меняет подход к созданию гибких и тестируемых Java-приложений. Суть этого. . .
Apache Airflow для оркестрации и автоматизации рабочих процессов
Mr. Docker 16.03.2025
Управление сложными рабочими процессами — одна из главных головных болей инженеров данных и DevOps-специалистов. Представьте себе: каждый день нужно запускать десятки скриптов в определенной. . .
Оптимизация приложений Java для ARM
Javaican 16.03.2025
ARM-архитектура переживает настоящий бум популярности в технологическом мире. Когда-то воспринимаемая исключительно как решение для мобильных устройств и встраиваемых систем, сегодня она штурмует. . .
Управление состоянием в Vue 3 с Pinia и Composition API
Reangularity 16.03.2025
Когда я начал работать с Vue несколько лет назад, мне казалось достаточным использовать простую передачу данных через props и события между компонентами. Однако уже на среднем по сложности проекте. . .
Введение в DevSecOps: основные принципы и инструменты
Mr. Docker 16.03.2025
DevSecOps - это подход к разработке программного обеспечения, который объединяет в себе принципы разработки (Dev), безопасности (Sec) и эксплуатации (Ops). Суть подхода заключается в том, чтобы. . .
GitHub Actions vs Jenkins: Сравнение инструментов CI/CD
Mr. Docker 16.03.2025
В этой битве за эффективность и скорость выпуска программных продуктов ключевую роль играют специализированные инструменты. Два гиганта в этой области — GitHub Actions и Jenkins — предлагают разные. . .
Реактивное программировани­е с Kafka Stream и Spring WebFlux
Javaican 16.03.2025
Реактивное программирование – это программная парадигма, ориентированная на потоки данных и распространение изменений. Она позволяет выражать статические или динамические потоки данных и. . .
Простая нейросеть на КуМир: Учебное пособие по созданию и обучению нейронных сетей
EggHead 16.03.2025
Искусственные нейронные сети — удивительная технология, позволяющая компьютерам имитировать работу человеческого мозга. Если вы хотя бы немного интересуетесь современными технологиями, то наверняка. . .
Исполнитель Кузнечик в КуМир: Решение задач
EggHead 16.03.2025
Среди множества исполнителей в системе КуМир особое место занимает Кузнечик — простой, но невероятно полезный виртуальный персонаж, который перемещается по числовой прямой, выполняя ваши команды. На. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru