Boost::Asio 中的 tcp::endpoint 和 udp::endpoint 有什么区别?

发布于 2024-09-11 11:55:11 字数 259 浏览 12 评论 0原文

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

是否存在显着差异可以证明单独分类是合理的? (即 tcp::socketudp::socket 不能同时接受 ip::endpoint 之类的东西吗?)

It seems boost::asio defines a separate endpoint class for each protocol, which is irritating if you want to perform both UDP and TCP operations on a particular endpoint (have to convert from one to the other). I'd always just thought of an endpoint as an IP address (v4 or v6) and the port number, regardless of TCP or UDP.

Are there significant differences that justify separate classes? (i.e. couldn't both tcp::socket and udp::socket accept something like ip::endpoint?)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

残龙傲雪 2024-09-18 11:55:11

套接字创建方式不同

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

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
鸵鸟症 2024-09-18 11:55:11

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

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文