您可以bind()和connect() UDP连接的两端吗

2024-05-02

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

是否可以绑定()和连接()两端,以便它们只能彼此发送/接收?这似乎是一种非常对称的方法。


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

其实背后是有原因的connect()在实践中使用 UDP 套接字(尽管有幸 POSIX及其实现 http://man7.org/linux/man-pages/man7/udp.7.html#DESCRIPTION理论上不需要你这样做)。

普通的 UDP 套接字不知道其未来目的地的任何信息,因此它每次都会执行一次路由查找sendmsg()叫做 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L1073.

然而,如果connect()预先使用特定远程接收者的 IP 和端口调用,操作系统内核将能够记下对路由的引用并将其分配给套接字 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/datagram.c#L23,如果随后发送消息,则显着加快发送消息的速度sendmsg() calls 不指定接收者 (否则之前的设置将被忽略 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L957),选择默认值。

看着那(这lines 1070通过1171 https://github.com/torvalds/linux/blob/v4.18-rc4/net/ipv4/udp.c#L1070:

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 套接字的完整功能 https://github.com/torvalds/linux/commit/96818159c3c08911330e84f86b3becf71aeeaac8#diff-7694f9a90076d47dc99a635be4a4409b.

它可能是一个来源显着的性能优势 https://www.ietf.org/mail-archive/web/quic/current/msg03721.html,尽管这在很大程度上取决于您所使用的操作系统。至少,如果您使用 Linux 并且不将套接字用于多个远程处理程序,那么您应该尝试一下。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

您可以bind()和connect() UDP连接的两端吗 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 如何在 C# 中打开 Internet Explorer 属性窗口

    我正在开发一个 Windows 应用程序 我必须向用户提供一种通过打开 IE 设置窗口来更改代理设置的方法 Google Chrome 使用相同的方法 当您尝试更改 Chrome 中的代理设置时 它将打开 Internet Explorer
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 有没有一种快速方法可以从 Jar/war 中删除文件,而无需提取 jar 并重新创建它?

    所以我需要从 jar war 文件中删除一个文件 我希望有类似 jar d myjar jar file I donot need txt 的内容 但现在我能看到从 Linux 命令行执行此操作的唯一方法 不使用 WinRAR Winzip
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 为什么使用小于 32 位的整数?

    我总是喜欢使用最小尺寸的变量 这样效果就很好 但是如果我使用短字节整数而不是整数 并且内存是 32 位字可寻址 这真的会给我带来好处吗 编译器是否会做一些事情来增强内存使用 对于局部变量 它可能没有多大意义 但是在具有数千甚至数百万项的结构
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 如何使用 JSch 将多行命令输出存储到变量中

    所以 我有一段很好的代码 我很难理解 它允许我向我的服务器发送命令 并获得一行响应 该代码有效 但我想从服务器返回多行 主要类是 JSch jSch new JSch MyUserInfo ui new MyUserInfo String
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前

随机推荐

  • OpenGL z轴指向哪里?

    我正在尝试了解 OpenGL 坐标系 我到处都看到它被描述为右撇子 但这与我的经验不符 我尝试绘制一些形状和 3 d 对象 我发现 z 轴显然指向 屏幕 而 x 指向右侧 y 指向上方 这是左手坐标系的描述 我缺少什么 编辑 例如 http
  • 如何正确关闭资源

    当我清理一些代码时 FindBugs 向我指出了一些使用 Connection CallableStatement 和 ResultSet 对象的 JDBC 代码 这是该代码的一个片段 CallableStatement cStmt get
  • 使用 ZF3 在模块引导程序中无法访问视图助手管理器

    Using Zend Framework 2我可以访问ViewHelperManager这样做 public function onBootstrap MvcEvent e viewHelperManager e gt getApplica
  • 似乎无法在 NSMenuItem 上 setEnabled:NO

    我已经子类化了NSMenu并连接了一堆NSMenuItem通过界面生成器 我已经通过调试器进行了测试 看看它们确实得到了初始化 菜单设置为不自动启用项目 仍然当我将任何 NSMenuItem 设置为 myMenuItem setEnable
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • 当包含 textColor 的样式应用于 textView 的 textAppearance 时,文本的颜色不会改变

    我想减少 xml 代码的重复 所以我为textView中的文本做了一些标准样式 我们可以在textView中的 style 属性和 android textAppearance 属性下应用样式 以下是我为文本外观制作的一些样式
  • 分别计算男女宿舍

    我想要的结果是这样的 males 1990 Q1 value Q2 value Q3 Value Q4 Value females Q1 value Q2 value Q3 Value Q4 value 如果任何值不存在则默认值 0 imp
  • x86-64 上这个语句有什么问题?

    该函数的目的是获取堆栈的起始地址 unsigned long find start void asm movq rsp eax 当我编译它时 出现错误 Error suffix or operands invalid for movq mo
  • 如何使用 Jersey 的内部路由机制来提取类/方法引用?

    我正在运行 Jersey 1 8 应用程序 Jersey 作为 Servlet 运行 我需要写一个小服务程序过滤器给定一个简单的请求 响应 能够确定哪个 REST 资源 方法将响应该请求并从注释中提取值 例如 假设我有以下资源 Path f
  • ruby on Rails 中的自动测试错误

    我运行了命令自动测试 这是我得到的错误 我正在关注 Hartl 的书 想知道这种冲突是否会发生 因为 Rails 现在附带了 ZenTest 还是其他东西 我怎样才能克服这个错误 我是 RoR 新手 Invalid gemspec in U
  • Flutter FireAuth 删除 reCAPTCHA 横幅(WEB)

    我正在创建一个 flutter web 应用程序 并使用 firebase auth 通过电话号码对用户进行身份验证 await auth signInWithPhoneNumber phoneNumber 执行此命令后 页面右下角会出现一
  • 嵌套 for 循环以列出具有不同“if”条件的理解

    我正在尝试将此嵌套循环转换为列表理解 但我不确定是否可能 因为 tmp 列表中的项目可能有不同的值 这是最好的方法吗 谢谢 final for a in range 13 1 for b in range 0 4 for c in rang
  • 使用不同间隔的任务运行 DAG

    我有 3 个任务 A B 和 C 我只想运行任务 A 一次 然后每月运行任务 B 直到 end date 然后仅运行任务 C 一次以进行清理 这与这个问题类似 但不适用 如何在气流中的单个 Dag 上处理不同的任务间隔 https stac
  • 从 Unity WebGL 调用 Angular2 函数

    目前 我正在使用 Angular2 版本 2 1 2 和 Unity 可视化工具 使用 Unity 5 5 构建 我需要做的是从 Unity 到 Angular2 进行通信 我正在使用类似于下面的代码 public void GetBill
  • 将最低部署目标升级到 iOS 9 后无法在 Xcode 9 中使用安全区域

    我刚刚将我的应用程序从支持 iOS 8 及更高版本更改为支持 iOS 9 及更高版本 我相信我已经正确完成了此操作 因为当我现在构建应用程序时 我会收到有关应用程序中已在 iOS 9 中弃用的所有内容的警告 我正在使用 Xcode 9 GM
  • 以系统帐户运行exe

    我正在尝试将我的 c exe 作为系统帐户运行 我怎样才能做到这一点 我试过了
  • 关于 servlet 的简要想法[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 从哪里可以获得有关 servlet 的知识 大多数人会从 Sun 的有关 servlet 的官方教程开
  • 使用 UpdatePanel 的 ASP.NET AJAX

    从概念上讲 我对 AJAX 的理解是异步发送到服务器的请求 也称为并行 当我使用多个UpdatePanels在页面上并触发多个异步回发 例如通过使用按钮 我注意到第二个请求在第一个请求完成之前才开始 但是当我使用 JQuery ajax 并
  • 您可以bind()和connect() UDP连接的两端吗

    我正在编写一个点对点消息队列系统 它必须能够通过 UDP 运行 我可以任意选择一侧或另一侧作为 服务器 但这似乎不太正确 因为两端都从另一端发送和接收相同类型的数据 是否可以绑定 和连接 两端 以便它们只能彼此发送 接收 这似乎是一种非常对