2010-07-23 4 views
6

Sembra boost :: asio definisce una classe di endpoint separata per ogni protocollo, che è irritante se si desidera eseguire entrambe le operazioni UDP e TCP su un particolare endpoint (è necessario convertire da uno all'altro). Ho sempre pensato a un endpoint come a un indirizzo IP (v4 o v6) e al numero di porta, indipendentemente dal protocollo TCP o UDP. Esistono differenze significative che giustificano classi separate? (Cioè non poteva sia tcp :: presa e presa :: UDP accettare qualcosa come ip :: endpoint?)Qual è la differenza tra tcp :: endpoint e udp :: endpoint in Boost :: Asio?

risposta

4

Le prese sono creati in modo diverso

socket(PF_INET, SOCK_STREAM) 

per TCP, e

socket(PF_INET, SOCK_DGRAM) 

per UDP.

Sospetto che questo sia il motivo dei diversi tipi di Boost.Asio. Vedere man 7 udp o man 7 tcp per ulteriori informazioni, presumo Linux poiché non hai taggato la tua domanda.

Per risolvere il problema, estrarre l'IP e la porta da un endpoint TCP e creare un'istanza di un endpoint 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; 
} 

campione invocazione:

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

TCP e UDP sono differenti. Ad esempio, due programmi separati possono essere ascoltati su una singola porta purché si utilizzi TCP e l'altro usi UDP. Questo è il motivo per cui le classi degli endpoint sono diverse.