Отправка и получение UDP на одном и том же порту - PullRequest
0 голосов
/ 01 ноября 2018

Я использую X-Plane, и он отправляет свои выходные данные UDP на 127.0.0.1:49000. Проблема возникает, когда мое приложение должно прослушивать один и тот же порт для получения данных через boost::asio.

Я использовал пример кода повышения в здесь и здесь .

// at main function:
udp_server server(49000);

// class implementation:
class udp_server
{
public:
    udp_server(int port) :
        io_service(),
        socket_(io_service, udp::endpoint(udp::v4(), port)) // Exception occurs here
    {
        start_receive();
        udp_thread = std::thread([this](){io_service.run();});
    }

    void start_receive()
    {
        socket_.async_receive_from(
            boost::asio::buffer(recv_buffer_), remote_endpoint_,
            boost::bind(&udp_server::handle_receive, this,
                boost::asio::placeholders::error,
                boost::asio::placeholders::bytes_transferred));
    }

    // ...

    std::thread udp_thread;

    boost::asio::io_service io_service;
    udp::socket socket_;
    udp::endpoint remote_endpoint_;
    boost::array<char, 5000> recv_buffer_;
};

Когда я запускаю код, я получаю исключение при инициализации сокета:

bind: была сделана попытка доступа к сокету способом, запрещенным его правами доступа

Это имеет смысл, потому что X-Plane пишет на этом порту, а я читаю с того же порта. Мы оба занимаем один и тот же порт. Есть ли способ преодолеть эту проблему? Если нет, значит ли это, что два приложения на компьютере не могут передавать сообщения через UDP?

1 Ответ

0 голосов
/ 01 ноября 2018

Это имеет смысл, потому что X-Plane пишет на этом порту, а я читаю с того же порта.

X-Plane отправляет с этого порта и получает на этого порта. Он будет записывать дейтаграммы (и получать дейтаграммы) с любого порта, на котором программы, с которыми он должен общаться, получают и отправляют.

Мы оба занимаем один и тот же порт. Есть ли способ преодолеть эту проблему?

Да, выберите другой порт для отправки из и получения на .

Если нет, значит ли это, что два приложения на компьютере не могут передавать сообщения через UDP?

Они, конечно, могут. Как правило, одна сторона выбирает известный порт, с которого она отправляет и получает. Другая сторона использует случайный порт, с которого она отправляет и получает, отправляя и получая сообщения от известного порта.

Итак, поток:

  1. X-Plane всегда связывается с известным портом, 49 000.
  2. Вы выбираете случайный порт, скажем, 31 020. Вы привязываетесь к этому порту.
  3. Вы отправляете датаграмму из порта 31 020 в порт 49 000, поскольку это хорошо известный порт X-Plane.
  4. X-Plane получает дейтаграмму от порта 31 020 до порта 49 000, порта, к которому он привязан. X-Plane отмечает, что датаграмма пришла из порта 31,020.
  5. X-Plane отправляет ответ на порт 31,020, порт, который прослушивает ваша программа, с порта 49000, с которого она связана и отправляет.
  6. Ваша программа получает дейтаграмму с порта 49 000 на порт 31 020, порт, который она прослушивает.
  7. Ваша программа знает, что это ответ от X-Plane, потому что он поступил из порта 49 000.
...