8

它似乎boost::asio为每个协议定义了一个单独的端点类,如果您想在特定端点上同时执行 UDP 和 TCP 操作(必须从一个端点转换到另一个端点),这很烦人。我一直认为端点是 IP 地址(v4 或 v6)和端口号,而不管 TCP 或 UDP。

是否存在显着差异来证明单独的类是合理的?(即不能同时tcp::socket接受udp::socket类似的东西ip::endpoint?)

4

2 回答 2

4

套接字的创建方式不同

socket(PF_INET, SOCK_STREAM)

对于 TCP,以及

socket(PF_INET, SOCK_DGRAM)

对于UDP。

我怀疑这是 Boost.Asio 中不同类型的原因。请参阅man 7 udpman 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
于 2010-07-23T17:55:16.243 回答
3

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

于 2011-11-17T06:00:15.940 回答