Как я могу передать исходный IP-адрес в UDP-сервер с помощью Boost ASIO - PullRequest
1 голос
/ 02 августа 2010

Мне нужно получить исходный IP-адрес для дейтаграммы на UDP-сервере, который я пишу с использованием boost ASIO. В примере сервера датаграмм udp строка:

Примечание: мой текущий код идентичен существующему примеру асинхронного сервера udp в документации по boost asio.

 socket_.async_receive_from(
        boost::asio::buffer(data_, max_length), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
          boost::asio::placeholders::bytes_transferred));

Проходит ошибка и bytes_transferred. Мне также нужен адрес сообщения.

Теперь я знаю, что могу использовать sender_endpoint_.address (). To_string () напрямую, но я Я хотел бы передать это в качестве параметра.

Поэтому я попытался поместить sender_endpoint_.address () в качестве параметра. т.е.

socket_.async_receive_from(
        boost::asio::buffer(data_, MAX_LENGTH), sender_endpoint_,
        boost::bind(&server::handle_receive_from, this,
          boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred,
                    sender_endpoint_.address()));

Но результат равен 0.0.0.0 при чтении из handle_receive_from. Однако, если я просто обращаюсь к sender_endpoint_.address () внутри handle_receive_from Я получаю 127.0.0.1, что является правильным.

Как правильно передать это? Мне это нужно, потому что несколько потоков будут вызывать io_service.run (), поэтому пакет из другого источника может перезаписать sender_endpoint, и мне нужно иметь возможность ответить на этот исходный пакет.

1 Ответ

0 голосов
/ 12 декабря 2010

I думаю , что если вы откроете sender_endpoint_.address () в своем обработчике до того, как настроите другой асинхронный обработчик, все будет в порядке и не будет переопределено.Вы снова вызываете async_receive_from в своем обработчике, верно, чтобы быть готовым принять другой пакет?

Во втором кодовом блоке, где вы пытаетесь использовать sender_endpoint_.address () в качестве параметра, функция sender_endpoint_.address () получаетВызывается при настройке обработчика, не выполняется обработчиком при получении пакета.Вот почему это всегда будет 0.0.0.0.

...