2010-07-23 11 views
6

Parece que boost :: asio define una clase de punto final separada para cada protocolo, lo cual es irritante si desea realizar operaciones UDP y TCP en un punto final en particular (tiene que convertir de una a la otra). Siempre había pensado en un punto final como una dirección IP (v4 o v6) y el número de puerto, independientemente de TCP o UDP. ¿Hay diferencias significativas que justifiquen clases separadas? (Es decir, podría no ambos tcp :: enchufe y toma :: UDP aceptar algo así como ip :: punto final?)¿Cuál es la diferencia entre tcp :: endpoint y udp :: endpoint en Boost :: Asio?

Respuesta

4

Las tomas se crean de forma diferente

socket(PF_INET, SOCK_STREAM) 

para TCP y

socket(PF_INET, SOCK_DGRAM) 

para UDP.

Sospecho que ese es el motivo de los diferentes tipos en Boost.Asio. Consulte man 7 udp o man 7 tcp para obtener más información, supongo que Linux ya que no etiquetó su pregunta.

Para resolver su problema, extraiga la IP y el puerto de un punto final TCP y cree una instancia de un punto final 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; 
} 

muestra de invocación:

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

puertos TCP y UDP son diferentes. Por ejemplo, dos programas separados pueden escuchar en un solo puerto siempre que uno use TCP y el otro use UDP. Esta es la razón por la cual las clases de puntos finales son diferentes.

Cuestiones relacionadas