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?
6
A
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.