What is the difference between tcp::endpoint and udp::endpoint in Boost::Asio?

The sockets are created differently

socket(PF_INET, SOCK_STREAM)

for TCP, and

socket(PF_INET, SOCK_DGRAM)

for UDP.

I suspect that is the reason for the differing types in Boost.Asio. See man 7 udp or man 7 tcp for more information, I'm assuming Linux since you didn't tag your question.

To solve your problem, extract the IP and port from a TCP endpoint and instantiate a UDP endpoint.

#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;
}

sample invocation:

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

TCP and UDP ports are different. For example, two separate programs can both listen on a single port as long as one uses TCP and the other uses UDP. This is why the endpoints classes are different.