2010-07-23 12 views
6

Wygląda na to, że boost :: asio definiuje oddzielną klasę punktów końcowych dla każdego protokołu, co jest irytujące, jeśli chcesz wykonywać zarówno operacje UDP, jak i TCP na określonym punkcie końcowym (musisz dokonać konwersji z jednego do drugiego). Zawsze myślałem o punkcie końcowym jako adresie IP (v4 lub v6) i numerze portu, niezależnie od TCP lub UDP. Czy istnieją znaczne różnice, które uzasadniają oddzielne klasy? (Czyli nie mógł zarówno tcp i udp :: gniazdo gniazdo :: zaakceptować coś takiego ip :: końcowego?)Jaka jest różnica między tcp :: endpoint i udp :: endpoint w Boost :: Asio?

Odpowiedz

4

Gniazda są tworzone różnie

socket(PF_INET, SOCK_STREAM) 

dla TCP i

socket(PF_INET, SOCK_DGRAM) 

dla UDP.

Podejrzewam, że jest to przyczyną różnych typów w Boost.Asio. Aby uzyskać więcej informacji, zobacz man 7 udp lub man 7 tcp, zakładam, że system Linux nie został oznaczony tagiem.

Aby rozwiązać problem, wyodrębnij adres IP i port z punktu końcowego TCP i stwórz punkt końcowy 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; 
} 

przykład wezwanie:

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

TCP i UDP są różne. Na przykład dwa oddzielne programy mogą jednocześnie nasłuchiwać na jednym porcie, dopóki używa się TCP, a drugi używa UDP. Właśnie dlatego klasy punktów końcowych są różne.

Powiązane problemy