В чем разница между tcp::endpoint и udp::endpoint в Boost::Asio?

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

2 ответов


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

socket(PF_INET, SOCK_STREAM)

для TCP, и

socket(PF_INET, SOCK_DGRAM)

для UDP.

Я подозреваю, что это является причиной различных типов в Boost.Азио. См.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

TCP и UDP порты отличаются. Например, две отдельные программы могут прослушивать один порт, пока одна использует TCP, а другая-UDP. Вот почему классы endpoints отличаются.