2010-07-23 16 views
6

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?

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.