2010-07-23 5 views
6

Il semble boost :: asio définit une classe de point de terminaison distincte pour chaque protocole, ce qui est irritant si vous voulez effectuer des opérations UDP et TCP sur un point de terminaison particulier (doivent passer de l'un à l'autre). Je pensais toujours à un point de terminaison comme une adresse IP (v4 ou v6) et le numéro de port, indépendamment de TCP ou UDP. Y a-t-il des différences significatives qui justifient des classes séparées? (C.-à-ne pouvait pas à la fois tcp :: prise et la prise udp :: accepter quelque chose comme ip :: point final?)Quelle est la différence entre tcp :: endpoint et udp :: endpoint dans Boost :: Asio?

Répondre

4

Les sockets sont créés différemment

socket(PF_INET, SOCK_STREAM) 

pour TCP et

socket(PF_INET, SOCK_DGRAM) 

pour UDP.

Je soupçonne que c'est la raison pour les différents types de Boost.Asio. Voir man 7 udp ou man 7 tcp pour plus d'informations, je suppose Linux puisque vous n'avez pas tagué votre question. Pour résoudre votre problème, extrayez l'adresse IP et le port d'un point de terminaison TCP et instanciez un point de terminaison 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; 
} 

invocation exemple:

./a.out 
tcp: 127.0.0.1:123 
udp: 127.0.0.1:123 
2

ports TCP et UDP sont différents. Par exemple, deux programmes distincts peuvent écouter sur un seul port tant que l'un utilise TCP et l'autre utilise UDP. C'est pourquoi les classes de points de terminaison sont différentes.

Questions connexes