你能绑定()和连接()UDP连接的两端吗

新手上路,请多包涵

我正在编写一个点对点消息队列系统,它必须能够通过 UDP 运行。我可以任意选择一侧或另一侧作为“服务器”,但这似乎不太正确,因为两端都在从另一端发送和接收相同类型的数据。

是否可以绑定()和连接()两端,以便它们只相互发送/接收?这似乎是一种很好的对称方式。

原文由 gct 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 277
1 个回答

你好,从遥远的未来,即 2018 年,到 2012 年。

事实上,在实践中 connect() 使用 UDP 套接字是有原因的(尽管有福的 POSIX 及其实现 在理论上并不要求您这样做)。

一个普通的 UDP 套接字对其未来的目的地一无所知,因此 每次调用 sendmsg() 时都会执行一次路由查找

但是,如果 connect() 事先使用特定远程接收器的 IP 和端口调用,操作系统内核将能够 写下对路由的引用并将其分配给套接字,从而显着加快发送速度如果后续的 sendmsg() 调用 未指定接收者否则先前的设置将被忽略),则会显示一条消息,而是选择默认设置。

查看 10701171 的行

 if (connected)
    rt = (struct rtable *)sk_dst_check(sk, 0);

if (!rt) {
    [..skip..]

    rt = ip_route_output_flow(net, fl4, sk);

    [..skip..]
}

在 Linux 内核 4.18 之前,此功能主要仅限于 IPv4 地址系列。但是,从 4.18-rc4(希望 Linux 内核版本 4.18 也是如此)开始, 它也完全可以使用 IPv6 套接字

它可能会带来巨大 的性能优势,尽管它在很大程度上取决于您使用的操作系统。至少,如果您使用的是 Linux 并且不将套接字用于多个远程处理程序,您应该尝试一下。

原文由 ximaera 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题