Форум программистов, компьютерный форум, киберфорум
Boost C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 29.03.2011
Сообщений: 81

Помогите с boost::asio::udp

24.10.2011, 18:15. Показов 2434. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Суть проблемы в том что есть асинхронный Udp сервер в составе приложения реализованный на boost. Который просто принимает сообщения (и посылает их в другой класс для обработки) и по надобности может отправить что-то. И этот сервер работает когда ему пожелается, т.е. может неделю работать нормально, а потом не работать пару дней (что вообще очень странно). Помогите разобраться в чем ошибка, в аппаратной части ничего не меняется, его "не работа" выражается в том что он тупо не биндит порт (проверяю netstat'ом), причем ни коем образом не сигнализирует об этом, перезапуск и перезагрузка не помогает.

Вот код:
Хедер
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
#ifndef UDP_SERVER_H
#define UDP_SERVER_H
 
#define MAX_BUFFLEN 50
#define MAX_DEQUE_LEN 500
 
#include <ctime>
#include <iostream>
#include <string>
#include <queue>
#include "common.h"
 
 
using boost::asio::ip::udp;
using namespace std;
 
class udp_server {
 
public:
    /**
     * @brief Инициализирует udp сервер приема сообщений библиотеки boost и начает прием на порт заданный в одноименном параметре
     * @param io_service
     * @param port - номер порта
     */
    udp_server(boost::asio::io_service& io_service, uint32_t port);
    /**
     * @brief Отправляет сообщение клиенту
     * @param message_send - отправляемое сообщение типа boost::shared_ptr<std::string>
     */
    void udp_send(boost::shared_ptr<std::string> message_send);
    /**
     * @brief Возвращает код и параметр события из очереди
     * @return returnCondition - структура обьявленная в common.h
     */
    returnCondition getLastCode();
    
    virtual ~udp_server();
private:
    void start_receive();
    /**
     * @brief Обработчик окончания приема, принятое сообщение записывает в очередь
     * @param error
     * @param bytes_transferred
     */
    void handle_receive(const boost::system::error_code& error,
                            std::size_t /*bytes_transferred*/);
                            
    void handle_send(boost::shared_ptr<std::string> /*message*/,
                        const boost::system::error_code& /*error*/,
                        std::size_t /*bytes_transferred*/);
      
    udp::socket socket_;
    udp::endpoint remote_endpoint_;
    deque <string> recv_buffer_1;
    char recv_buf_[MAX_BUFFLEN];
    //boost::mutex eth_mutex;
 
};
 
#endif // UDP_SERVER_H
CPP:

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
#include "udp_server.h"
 
udp_server::udp_server(boost::asio::io_service& io_service, uint32_t port)
    : socket_(io_service, udp::endpoint(udp::v4(), port))
{
    start_receive();
}
 
void udp_server::udp_send(boost::shared_ptr<std::string> message_send)
{
    socket_.async_send_to(boost::asio::buffer(*message_send), remote_endpoint_,
          boost::bind(&udp_server::handle_send, this, message_send,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));
          
}
 
returnCondition udp_server::getLastCode()
{
    
    returnCondition ret;
    
    ret.r_Code=recv_buffer_1.size();
    if(ret.r_Code!=0)
    {
        ret.r_param=recv_buffer_1.front();
        recv_buffer_1.pop_front();
        
    }
    else ret.r_param="";
    
    return ret;
}
 
void udp_server::start_receive()
{
    socket_.async_receive_from(
        boost::asio::buffer(recv_buf_), remote_endpoint_,
        boost::bind(&udp_server::handle_receive, this,
        boost::asio::placeholders::error,
        boost::asio::placeholders::bytes_transferred));
}
 
void udp_server::handle_receive(const boost::system::error_code& error,
      std::size_t bytes_transferred)
{
 
    if(recv_buffer_1.size()<MAX_DEQUE_LEN) // Проверяем что бы размер очереди не превышал опред. размера
    {
        if (!error || error == boost::asio::error::message_size)
        {
            recv_buffer_1.push_back(recv_buf_);
            //cout<<"added to deque"<<endl;
            start_receive();
        }
        else cout<<"Error boost::handle message from ARM"<<endl;
    }
    
}
 
void udp_server::handle_send(boost::shared_ptr<std::string> /*message*/,
      const boost::system::error_code& /*error*/,
      std::size_t /*bytes_transferred*/)
{
 
}
 
 
  
udp_server::~udp_server()
{
}
Создается класс так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
try
    {
        /*
         * Инициализация UDP сервера
         */
        // запускаем udp_server в отдельном потоке
        
            cout<<"Starting thread of udp_server...";
            boost::asio::io_service io_service;
            server=new udp_server(io_service, 3333); //! Прослушиваемый порт задается тут!!!
            boost::thread thread_ethernet ( boost::bind(&boost::asio::io_service::run, boost::ref(io_service)) );
            cout<<"done"<<endl;
        
    }
    catch (std::exception &e)
    {
        cout<<"Something's wrong happend while initin udp_server"<<e.what()<<endl;
    }
Сообщения забираются так:

C++
1
2
3
4
ret1=server->getLastCode();
        if(ret1.r_Code>=E_READY_CONDITION) //Потому что возвращает количество кодовых комбинаций в очереди
        {
            cout<<"Was accepted from ethernet code="<<ret1.r_param<<endl;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2011, 18:15
Ответы с готовыми решениями:

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

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

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

5
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.10.2011, 18:32
попробуй "вручную" забайндить сокет: http://www.boost.org/doc/libs/... /bind.html
1
7 / 7 / 1
Регистрация: 29.03.2011
Сообщений: 81
24.10.2011, 18:54  [ТС]
Попробовал bind возвращает ошибку system:22
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
24.10.2011, 19:07
ну вот. и зачем же ты это скрывал?
0
7 / 7 / 1
Регистрация: 29.03.2011
Сообщений: 81
25.10.2011, 09:37  [ТС]
Не скрывал я ничего, так я ж по твоему совету и попробывал, ошибка кстати Invalid argument... вообще понять не могу, ошибка в бусте или в моей криворукости или в железе, которое стало как-то странно быстро нагреваться. Ну в железе это конечно перебор, ssh то работает.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2011, 14:15
Цитата Сообщение от Driim Посмотреть сообщение
Invalid argument
из этого: "system:22", я уже понял что за ошибка. покажи код.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2011, 14:15
Помогаю со студенческими работами здесь

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

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

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

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

boost::asio cессии
Здравствуйте. Хотелось бы узнать ответ на вопрос, который не где не нашол. Сервер реализован на Boost:asio, к нему подключаются клиенты,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru