Кажется, boost: asio определяет отдельный класс конечных точек для каждого протокола, что вызывает раздражение, если вы хотите выполнять как UDP, так и TCP-операции на конкретной конечной точке (приходится конвертировать из одного в другой). Я всегда думал о конечной точке как о IP-адресе (v4 или v6) и номере порта, независимо от TCP или UDP. Существуют ли существенные различия, которые оправдывают отдельные классы? (Т.е. не может и ТСР :: гнездо и УДП :: сокет принимает что-то вроде IP :: конечной точки?)В чем разница между tcp :: endpoint и udp :: endpoint в Boost :: Asio?
6
A
ответ
4
Гнезда создаются по-разному
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
TCP и UDP порты отличаются. Например, две отдельные программы могут прослушивать один порт, если один использует TCP, а другой использует UDP. Вот почему классы конечных точек различны.