Что является различием между tcp:: конечная точка и udp:: конечная точка в Повышении:: Asio?

Это кажется повышением:: asio определяет отдельный класс конечной точки для каждого протокола, который является раздражающим, если Вы хотите выполнить и UDP и операции TCP на конкретной конечной точке (должны преобразовать от одного до другого). Я всегда только что думал о конечной точке как о IP-адресе (v4 или v6) и номер порта, независимо от TCP или UDP. Есть ли существенные различия, которые выравнивают по ширине отдельные классы? (т.е. не могли оба tcp:: сокет и udp:: сокет принимает что-то как IP:: конечная точка?)

7
задан Michael Hardy 23 July 2010 в 17:07
поделиться

1 ответ

Сокеты создаются по-разному

socket(PF_INET, SOCK_STREAM)

для TCP и

socket(PF_INET, SOCK_DGRAM)

для UDP.

Я подозреваю, что это причина разных типов в Boost.Asio. См. man 7 udp или man 7 tcp для получения дополнительной информации. Я предполагаю, что Linux, поскольку вы не пометили свой вопрос.

Чтобы решить вашу проблему, извлеките IP-адрес и порт из конечной точки TCP и создайте экземпляр конечной точки UDP.

#include <boost/asio.hpp>

#include <iostream>

int
main()
{
    using namespace boost::asio;
    ip::tcp::endpoint tcp( 
            ip::address::from_string("127.0.0.1"),
            123
            );

    ip::udp::endpoint udp(
            tcp.address(),
            tcp.port()
            );

    std::cout << "tcp: " << tcp << std::endl;
    std::cout << "udp: " << udp << std::endl;

    return 0;
}

пример вызова:

./a.out 
tcp: 127.0.0.1:123
udp: 127.0.0.1:123
4
ответ дан 7 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: