Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/35: Рейтинг темы: голосов - 35, средняя оценка - 4.94
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 8

[boost::asio] UDP-server

12.08.2012, 21:24. Показов 7036. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Используя библиотеку boost::asio создаю udp-server. Но при запуске приложения, когда уже одно запущено, приложение выбрасывает исключение. Как подключить socket к порту, который уже занят?
Вот мой класс:



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
CMyServer::CMyServer(boost::asio::io_service&  IO_Servoce,short ListenPort=6000):
m_io_Service(IO_Servoce),m_UdpSocket(IO_Servoce,udp::endpoint(udp::v4(),ListenPort)),messages_sent_(0)
{
    m_UdpSocket.set_option(boost::asio::ip::udp::socket::reuse_address(true));
    m_ListenEndpoint=udp::endpoint(udp::v4(),ListenPort);
    m_UdpSocket.async_receive_from(
        boost::asio::buffer(data_, max_length), m_Sender_Endpoint,
        boost::bind(&CMyServer::handle_receive_from, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}
 
void CMyServer::handle_receive_from(const boost::system::error_code& error,size_t bytes_recvd)
{
    if (error) {
        std::cout << "receive error!" << std::endl;
        return;
    }
    std::string  message(data_, bytes_recvd);
    std::cout << "receive Msg:"<< message<< std::endl;
    if (message=="stop")FlagThread=false;
    m_UdpSocket.async_receive_from(
        boost::asio::buffer(data_, max_length), m_Sender_Endpoint,
        boost::bind(&CMyServer::handle_receive_from, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
    boost::lock_guard<boost::recursive_mutex>    lock(mutex_);
    messages_.push_back(message);
}
 
void CMyServer::handle_send_to(const boost::system::error_code& error,size_t )
{
    if (error) {
        std::cout << "send error!" << std::endl;
    }
    ++messages_sent_;
    m_UdpSocket.async_receive_from(
        boost::asio::buffer(data_, max_length), m_Sender_Endpoint,
        boost::bind(&CMyServer::handle_receive_from, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}
 
void CMyServer::send(udp::endpoint other_end, const std::string &message)
{
    m_UdpSocket.async_send_to(
        boost::asio::buffer(message.c_str(), message.size()),
        other_end,
        boost::bind(&CMyServer::handle_send_to, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}
 
void CMyServer::Service_threadRun(void)
{
    while(FlagThread)
    {
        io_Service.run();
        io_Service.reset();
    }
}
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL, ".1251");
    try
    {
        //udp::socket m_UdpSocket(io_service, udp::endpoint(udp::v4(), 6000));
        
 
        CMyServer ServerA(io_Service,6000);
        FlagThread=true;
        boost::thread  ServerThread;//(CMyServer::Service_threadRun());
        udp::resolver resolver(io_Service);
        udp::resolver::query query(udp::v4(), "192.168.20.14", "6000");
        udp::endpoint endp_a = *resolver.resolve(query);
        io_Service.run();
 
        std::stringstream   sstr;
        boost::this_thread::yield();
        while(FlagThread){}
        io_Service.stop();
        ServerThread.join();
    }
 
    catch (std::runtime_error &exc)
    {
        std::cout << "runtime_error: " << exc.what() << std::endl;
        FlagThread=false;
    }
    catch (...)
    {
        std::cout << "Oops!" << std::endl;  
        FlagThread=false;
    }
        system("pause");
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2012, 21:24
Ответы с готовыми решениями:

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

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

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

13
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.08.2012, 01:32
Цитата Сообщение от vasilyi Посмотреть сообщение
Как подключить socket к порту, который уже занят?
зачем такое делать?
сам факт того, что ты пытаешься забиндится на занятый порт - нелеп.

Добавлено через 1 минуту
ты что, два сервера запускаешь забинденных на один порт?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
13.08.2012, 09:52
Цитата Сообщение от niXman Посмотреть сообщение
зачем такое делать?
Основное (и единственное "легальное") применение - мультикаст. Большинство ОС не умеют/не разрешают разделять порт для других целей.
0
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 8
13.08.2012, 10:09  [ТС]
Дело в том, что переделываю данный пример с Qt, а там это было сделать вполне легально и легко

Добавлено через 1 минуту
А разве строчка

m_UdpSocket.set_option(boost::asio::ip:: udp::socket::reuse_address(true));

не должна решать данную проблему?
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.08.2012, 11:20
Цитата Сообщение от vasilyi Посмотреть сообщение
не должна решать данную проблему?
какую проблему?
я тебе задал вопрос:
Цитата Сообщение от niXman Посмотреть сообщение
ты что, два сервера запускаешь забинденных на один порт?
Добавлено через 2 минуты
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Основное (и единственное "легальное") применение - мультикаст.
я хз. никогда с UDP не работал.
а что, при использовании UDP, два сервера на одной машине могут использовать одновременно один и тот же порт?
0
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 8
13.08.2012, 12:18  [ТС]
Сообщение от niXman
ты что, два сервера запускаешь забинденных на один порт?

да, именно так, при использовании Qt это можно сделать абсолютно безболезненно для UDP
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
13.08.2012, 12:21
Цитата Сообщение от niXman Посмотреть сообщение
а что, при использовании UDP, два сервера на одной машине могут использовать одновременно один и тот же порт?
Да, могут. Но смысл есть только для мультикаст и бродкаст трафика - одни и те же данные будут принимать все сокеты.

Добавлено через 43 секунды
vasilyi, а за чем Вам это?
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.08.2012, 12:46
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
смысл есть только для мультикаст и бродкаст трафика - одни и те же данные будут принимать все сокеты.
понял.
0
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 8
13.08.2012, 13:40  [ТС]
Просто стало интересно реализуемо ли это на bost.

Есть еще один вопрос, а можно ли каким-либо образом узнать размер сообщения, которое пришло, чтобы выделить под него буфер нужного размера?

Добавлено через 21 секунду
boost*
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
13.08.2012, 13:58
Цитата Сообщение от vasilyi Посмотреть сообщение
Просто стало интересно реализуемо ли это на bost.
Я не использую boost, но на 100% уверен, что можно, со стороны библиотеки (любой не важно qt/boost/...) ничего кроме setsockopt() не требуется. Остальное зависит от ОС, кто-то разрешает делать это для INADDR_ANY, а кто-то только для конкретного адреса.
Подождите, придет кто-нибудь использующий его или Nixman разберется. Ну или просто поглите boost asio udp reuse_address, у людей работает...
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.08.2012, 14:51
да, reuse_address для этого и служит.

vasilyi, что-то у тебя все дико сложно получилось. тебе не нужен resolver.
смотри примеры к asio:
http://www.boost.org/doc/libs/... sender.cpp
http://www.boost.org/doc/libs/... ceiver.cpp
1
0 / 0 / 0
Регистрация: 12.08.2012
Сообщений: 8
13.08.2012, 15:25  [ТС]
Спасибо, разобрался, а никто не знает как же всетаки узнать размер пришедшего сообщения?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
13.08.2012, 15:32
http://www.boost.org/doc/libs/... dable.html
1
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
13.08.2012, 15:48
в хендлере чтения async_reсeive_from() передается размер пришедшего сообщения.

Добавлено через 10 минут
так же, у UDP сокета есть метод available() который вернет кол-во байт доступных для чтения.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2012, 15:48
Помогаю со студенческими работами здесь

boost::asio
начал ковырять буст. Возник вопрос с созданием клинт-серверного приложения. Для ознакомления хочу посмотреть простой пример, где сервер...

boost/asio
Кто тестил asio в Вuilder-е? Код использовал отсюда https://www.cyberforum.ru/cpp-beginners/thread329576.html И напоролся сразу...

Boost.asio
Добрый день. Я только начал знакомство с boost.asio и при использовании примеров с офф.сайта никак не могу разобраться в их работе. Вот...

Boost Asio C++
Добрый день. Юзаю этот ( http://www.boost.org/ ) проект. Нужна помощь с документаций...

C++ | boost::asio + ssl?
Доброго времени суток! Хотелось бы узнать как подключаться по SSL? int main() { boost::asio::ip::tcp::iostream stream; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru