我正在编写一个点对点消息队列系统,它必须能够通过 UDP 运行。我可以任意选择一侧或另一侧作为“服务器”,但这似乎不太正确,因为两端都在从另一端发送和接收相同类型的数据。
是否可以绑定()和连接()两端,以便它们只相互发送/接收?这似乎是一种很好的对称方式。
原文由 gct 发布,翻译遵循 CC BY-SA 4.0 许可协议
7 回答5.3k 阅读
4 回答4k 阅读
2 回答5.9k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
1 回答2.3k 阅读✓ 已解决
2 回答799 阅读✓ 已解决
1 回答3.3k 阅读
你好,从遥远的未来,即 2018 年,到 2012 年。
事实上,在实践中
connect()
使用 UDP 套接字是有原因的(尽管有福的 POSIX 及其实现 在理论上并不要求您这样做)。一个普通的 UDP 套接字对其未来的目的地一无所知,因此 每次调用
sendmsg()
时都会执行一次路由查找。但是,如果
connect()
事先使用特定远程接收器的 IP 和端口调用,操作系统内核将能够 写下对路由的引用并将其分配给套接字,从而显着加快发送速度如果后续的sendmsg()
调用 未指定接收者( 否则先前的设置将被忽略),则会显示一条消息,而是选择默认设置。查看
1070
到1171
的行:在 Linux 内核 4.18 之前,此功能主要仅限于 IPv4 地址系列。但是,从 4.18-rc4(希望 Linux 内核版本 4.18 也是如此)开始, 它也完全可以使用 IPv6 套接字。
它可能会带来巨大 的性能优势,尽管它在很大程度上取决于您使用的操作系统。至少,如果您使用的是 Linux 并且不将套接字用于多个远程处理程序,您应该尝试一下。