它似乎boost::asio
为每个协议定义了一个单独的端点类,如果您想在特定端点上同时执行 UDP 和 TCP 操作(必须从一个端点转换到另一个端点),这很烦人。我一直认为端点是 IP 地址(v4 或 v6)和端口号,而不管 TCP 或 UDP。
是否存在显着差异来证明单独的类是合理的?(即不能同时tcp::socket
接受udp::socket
类似的东西ip::endpoint
?)
它似乎boost::asio
为每个协议定义了一个单独的端点类,如果您想在特定端点上同时执行 UDP 和 TCP 操作(必须从一个端点转换到另一个端点),这很烦人。我一直认为端点是 IP 地址(v4 或 v6)和端口号,而不管 TCP 或 UDP。
是否存在显着差异来证明单独的类是合理的?(即不能同时tcp::socket
接受udp::socket
类似的东西ip::endpoint
?)
套接字的创建方式不同
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
TCP 和 UDP 端口不同。例如,只要一个使用 TCP 而另一个使用 UDP,两个独立的程序都可以监听一个端口。这就是端点类不同的原因。