代码之家  ›  专栏  ›  技术社区  ›  Michael Hardy

boost::asio中的tcp::endpoint和udp::endpoint有什么区别?

  •  7
  • Michael Hardy  · 技术社区  · 14 年前

    似乎boost::asio为每个协议定义了一个单独的端点类,如果您想在一个特定的端点上同时执行UDP和TCP操作(必须从一个端点转换到另一个端点),这会很恼人。我一直认为端点是一个IP地址(v4或v6)和端口号,而不管TCP或UDP是什么。是否有显著的差异来证明独立的类是正确的?(即,不能同时接受tcp::socket和udp::socket之类的内容吗?:endpoint?)

    2 回复  |  直到 13 年前
        1
  •  4
  •   Sam Miller    14 年前

    套接字的创建方式不同

    socket(PF_INET, SOCK_STREAM)
    

    对于TCP,以及

    socket(PF_INET, SOCK_DGRAM)
    

    对于UDP。

    我怀疑这就是boost.asio中不同类型的原因。见 man 7 udp man 7 tcp 有关更多信息,我假设Linux,因为您没有标记您的问题。

    要解决您的问题,请从TCP端点提取IP和端口,并实例化一个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;
    }
    

    示例调用:

    ./a.out 
    tcp: 127.0.0.1:123
    udp: 127.0.0.1:123
    
        2
  •  2
  •   fabspro    13 年前

    TCP和UDP端口不同。例如,只要一个使用TCP,另一个使用UDP,两个独立的程序都可以在一个端口上侦听。这就是端点类不同的原因。