Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
1

Чат без сервера на Boost.Asio (broadcast и udp)

08.05.2014, 22:39. Показов 2444. Ответов 5
Метки нет (Все метки)

Здравствуйте!

Передо мной стоит задача написать чат, не использующий сервер (для небольшой локальной сети). Для написания используем Boost.Asio (udp, асинхронный). С сетями почти не работал раньше, поэтому есть пару вопросов.

Правильно ли я рассуждаю: клиент коннектиться к broadcast-адресу (в случае моей подсети с адресами 192.168.х.х это будет 192.168.0.255 ?), шлет на него udp-пакет, а этот пакет расшаривается на все адреса сети. Так иль не так?
Можно пару примеров кода?

Спасибо!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.05.2014, 22:39
Ответы с готовыми решениями:

Помогите с boost::asio::udp
Суть проблемы в том что есть асинхронный Udp сервер в составе приложения реализованный на boost....

[boost::asio] UDP-server
Используя библиотеку boost::asio создаю udp-server. Но при запуске приложения, когда уже одно...

Boost::asio::ip::udp::socket bind а мне нужен не локальный хост
Здравствуйте. Пытаюсь наладить для своих нужд пример #include <iostream> #include <string>...

Boost.Asio. Как получить ответ от сервера в формате json или xml
Все привет, столкнулся с проблемой. Допустим, с помощью boost.asio и OpenSSL я делаю GET запрос...

5
0 / 0 / 1
Регистрация: 08.05.2014
Сообщений: 9
09.05.2014, 10:59 2
Вы хоть в доки самого boost::asio посмотрите. Там примеров хоть отгребай
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
09.05.2014, 16:38  [ТС] 3
softirqd, я смотрел и как-то не нашел там нужную информацию. Прошу заметить, вопрос выше был не столько по boost::asio, сколько в целом про принципы работы программ, работающих с сетью и не использующих сервер.
0
0 / 0 / 1
Регистрация: 08.05.2014
Сообщений: 9
09.05.2014, 17:44 4
По правилам жанра, на каждом хосте создаётся сокет, биндится на определённый IP и порт.
Потом участники обмена могут слать адресно друг другу UDP датаграммы с sendto и recvfrom
тут можно для затравки глянуть.
В boost::asio есть весь набор соответствующего API в том числе и с асинхронным поведением
вроде ip::udp::socket::async_receive_from() ip::udp::socket::async_send_to()
Если нужно, чтоб пакет получили все хосты локальной или какой-то сети, то адрес получателя
в send устанавливается в широковешательный для этой сети, который совпадает с маской этой сети.
Отправив широковещательный запрос в сеть, можно ожидать первый ответ с recvfrom, который принимает
в списке параметров указатель на структуру sockaddr, в которую запишется адрес отправителя, и с которым
можно дальше общаться адресно.
0
4 / 4 / 3
Регистрация: 30.09.2012
Сообщений: 63
09.05.2014, 23:22  [ТС] 5
softirqd,
Цитата Сообщение от softirqd Посмотреть сообщение
биндится на определённый IP и порт.
Попахивает сервером, нет? Я просто не совсем понял. Вот, допустим: у меня есть локалка, 10 компов. Я на одном запускаю чат, как он будет при включении знать куда подключиться? Мое предположение: мы все же его сразу биндим с широковещательным адресом и потом туда шлем сообщения, а все клиенты подключенные к нему их получают. Я правильно рассуждаю?
0
0 / 0 / 1
Регистрация: 08.05.2014
Сообщений: 9
10.05.2014, 00:24 6
Первое, Вы обязательно должны создать сокет, назначить порт и IP, который может быть и INADDR_ANY.
IP и порт связаны с структурой ядра, которая создаётся при создании сокета, и, если пара IP/PORT для
пришедшего из сети пакета не соответствуют ни одной структуре, пакет дропается с отсылом уведомления отправителю.
Приложение слушает сокет, если это UDP сокет, то достаточно или сделать блокирующий recvfrom, или сделать сокет non block
и передать его асинхронному реактору для отслеживания событий на этом сокете, который, при получении пакета,
запустит хендлер обработчик.
Сервером начнёт попахивать если будут использоваться TCP сокеты. Тогда одна из сторон
должна будет обязательно принимать запрос accept-ом.

ЗЫ все чаты типа ISQ, IRC, на самом деле организовываются передачей сообщений между клиентами через
единый сервер. Вся логика строится на уровне протокола прикладного уровня. На уровне передачи сетевых
пакетов используется постоянное TCP соединение клиентов с сервером.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.05.2014, 00:24

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Boost::Asio клиент - сервер: При вводе с телнета на стороне сервера появляется куча крякозябр
Раньше использовал Code::Blocks и winsock. Сейчас решил попробовать VS2013 и библиотеку boost::asio...

Эхо сервер без Qt, Boost и тп (TCP/UDP)
Добрый день! Стоит задача - реализовать эхо сервер (клиент-серверное приложение), которое будет...

UDP чат без использования стандартных компонентов
Здраствуйте! Срочно нужен UDP чат но БЕЗ ИСПОЛЬЗОВАНИЯ стандартных компонентов... Кто может...

UDP чат без использования стандартных компонентов
Здраствуйте! Срочно нужен UDP чат но БЕЗ ИСПОЛЬЗОВАНИЯ стандартных компонентов... Кто может...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.