Es scheint, boost :: asio definiert eine separate Endpunktklasse für jedes Protokoll, was irritierend ist, wenn Sie sowohl UDP- als auch TCP-Operationen an einem bestimmten Endpunkt durchführen wollen (müssen von einem zum anderen konvertieren). Ich hatte immer nur einen Endpunkt als IP-Adresse (v4 oder v6) und die Portnummer, unabhängig von TCP oder UDP. Gibt es signifikante Unterschiede, die separate Klassen rechtfertigen? (Dh konnte nicht beide tcp :: Socket und udp :: Socket akzeptieren etwas wie ip :: Endpunkt?)Was ist der Unterschied zwischen tcp :: endpoint und udp :: endpoint in Boost :: Asio?
6
A
Antwort
4
Die Buchsen sind erstellt unterschiedlich
socket(PF_INET, SOCK_STREAM)
für TCP und
socket(PF_INET, SOCK_DGRAM)
für UDP.
Ich vermute, dass das der Grund für die unterschiedlichen Typen in Boost.Asio ist. Weitere Informationen finden Sie unter man 7 udp
oder man 7 tcp
. Ich nehme Linux an, da Sie Ihre Frage nicht markiert haben.
Um Ihr Problem zu lösen, extrahieren Sie die IP und den Port von einem TCP-Endpunkt und instanziieren Sie einen UDP-Endpunkt.
#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;
}
Beispielaufruf:
./a.out
tcp: 127.0.0.1:123
udp: 127.0.0.1:123
2
TCP- und UDP-Ports sind unterschiedlich. Zum Beispiel können zwei separate Programme beide auf einem einzelnen Port hören, solange einer TCP verwendet und der andere UDP verwendet. Aus diesem Grund unterscheiden sich die Endpoints-Klassen.