В чем разница между tcp :: endpoint и udp :: endpoint в Boost :: Asio? - PullRequest
7 голосов
/ 23 июля 2010

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

Ответы [ 2 ]

4 голосов
/ 23 июля 2010

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

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
2 голосов
/ 17 ноября 2011

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

...