UDP sendto 上的 ECONNREFUSED 错误

2024-04-07

我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto() 向多个端口发送 UDP 数据(所有端口均使用套接字(PF_INET, SOCK_DGRAM, 0))为了一组客户端读取进程的利益。这些 sendto() 偶尔会不可预测地触发经济拒绝错误。这种情况发生在 macOS Sierra (10.12) 系统上,其 sendto(2) 手册页甚至没有列出经济拒绝作为一个可能的错误。有趣的是,我有一个 CentOS7 系统(这些错误永远不会发生),其 sendto(2) 手册页引用了 udp(7) 手册页上记录的其他 sendto() 错误,并且 CentOS7 udp(7) 页面显示:

经济拒绝

 No receiver was associated with the destination address. This
 might be caused by a previous packet sent over the socket.

(经济拒绝macOS Sierra udp(4) 页面上的任何地方都没有提及。) 我不知道 CentOS7 手册页与 macOS 是否有任何相关性, 但假设他们这样做了,上面的解释经济拒绝关于 sendto() 在以下几点上令人困惑:

首先,我所听到的有关 UDP 的一切都强调它的无连接性质。那么,为什么 sendto() 会因为没有连接接收器(或“关联”,如手册页所述,我认为是同一件事)而失败? UDP 的全部意义不就是如果你是一个说话者,你就只是喋喋不休,不在乎其他人是否在听?然而,这些 CentOS7 udp(7) 注释似乎确实适用于我的 Sierra 系统,因为当我运行绑定到这些端口并从这些端口读取数据的客户端进程时,我永远不会遇到问题,但如果我启动 UDP writer 在读者运行之前我会经常(但不总是) 看到这些错误。

其次,根据 CentOS7 udp(7),任何人都可以向我解释为什么吗? 文档,通过套接字发送的前一个数据包可能会导致不 接收者为与目标地址相关联?这使得不 对我来说毫无意义。是否有些数据报的毒性如此之大,以至于读它们的人都会被杀死?

我还应该注意到,除了在 CentOS7 上从未见过这个问题之外 在它实际(如果模糊)记录的地方,我也从未在 Sierra 之前的任何 MacOS 版本上经历过它,并且这段代码多年来一直运行良好。我仍然有一个 El Capitan 系统,无法重复那里的错误。

以下是有关我的应用程序的更多信息 - 请随时发表评论 关于上述有关 PF_INET UDP、sendto() 和的一般问题经济拒绝或我的应用程序的更具体细节,如下所述。我已经有了一个可用的解决方法(见下文),但想更好地了解发生了什么。

我的应用程序正在从各种来源(串行线路和/或 UDP 端口)读取数据,将其整理为各种类型的重新格式化输出消息,然后将这些消息写入多个预定义的连续编号(例如,3000 到 3004)的 UDP 端口相同的 IP 地址由少量且可变数量的客户端(限制为 5 个,但通常不超过 3 或 4 个)读取。每个客户端都会扫描我的应用程序的 UDP 输出端口的预定义列表,绑定到第一个可用端口,然后从该端口进行所有读取。无法提前保证我的编写器应用程序和多个读取器进程的启动顺序(这里是我的问题的核心部分)。我的应用程序大约每秒向每个输出端口写入一次消息,每个输出端口通常不超过 80 个字节(均为 ASCII 文本)。

这些读取器客户端可能在 (i) 与我的应用程序相同的本地主机上运行,​​(ii) 单个远程主机,或 (iii) 本地网络上的不同远程主机上运行,​​因此我的编写器应用程序接受任意 IPv4 目标地址作为命令参数。假设我的编写器在主机 192.168.1.LLL(本地主机)上运行,最常用的目标地址将是:

  • 127.0.0.1
  • 192.168.1.LLL(localhost的实际外部地址)
  • 192.168.1.RRR(同一 LAN 上的某些远程主机)
  • 192.168.1.255(多个远程主机上的读者的本地广播)

请注意,我仅在将输出发送到 127.0.0.1 时看到这些错误 或 192.168.1.LLL,本地主机的实际外部地址。这 当我写入特定的远程主机时,永远不会发生错误 192.168.1.RRR 或 LAN 的广播地址 192.168.1.255。有没有 本地 PF_INET 与远程 PF_INET UDP 写入之间应该有什么区别?也许本地写入必须在某些本地缓冲区中以特定方式进行处理,该缓冲区受到各种限制,而离开主机发送的数据包只是散落在风中,并且发生的任何情况都被认为超出了本地 sendto() 的报告能力?尽管我在使用广播地址 192.168.1.255 时从未看到这些错误,但出于网络礼貌,我宁愿不使用该地址,除非我知道我的客户端确实在多个远程主机上运行 - 如果所有内容都在一个系统上,我宁愿保留通过使用严格本地地址 127.0.0.1 或 192.168.1.LLL(这些地址可能会导致错误)来实现私有。

现在我正在通过忽略所有来解决这个问题经济拒绝sendto() 错误。看来我倾向于在启动应用程序后的几秒钟内获取它们,尽管从来没有在每个端口上的第一个 sendto() 上获取它们,并且通常只在我的 5 个输出端口中的一个上获取它们(尽管生成错误的端口并不总是相同) )。而且,在最初的错误之后,接下来几分钟的输出(我见过的最长的时间)是没有错误的,即使仍然没有读者在运行。然而,这些错误令人费解,我想更好地理解它们,以使我的代码尽可能健壮。我没有在这篇文章中包含我的实际代码,因为后者已经太长了,而且据我所知,代码没有什么异常,但如果有用的话,我可以单独发布它。

Thanks!

罗杰·戴维斯, 大学。夏威夷的


在 UDP 层,您可以向任何 IP 发送消息。RFC1122 https://www.rfc-editor.org/rfc/rfc1122#page-79,第 4.1.3.3 节,指示 IP 层的任何错误(导致 ICMP 错误发生)必须将错误传播回应用程序层。正如你所看到的RFC792 https://www.rfc-editor.org/rfc/rfc792第 3 页,代码 3 消息是Port Unreachable.

因此,IP 数据包无法发送到 127.0.0.1 端口将导致 icmp 错误,在应用层表现为 ECONNREFUSED。据报告是异步的(因为 icmp 有回复超时),并且那时您可能已经发送了另一个 udp 数据包。

为什么它更多地发生在本地连接上?该数据包实际上不会离开内核,因此它可以在发送下一个 udp 数据包之前回复 ICMP 错误。在其他地址上,它实际上必须放在线上。因此,您仍然可能会收到错误,但根据您的 UDP 发送速率,错误的频率会降低。此外,如果您通过网关发送,网关可能会丢弃 udp 数据包。如果您的主机和远程主机之间存在防火墙,它也可能会丢弃 icmp 回复,或限制回复的返回率。

解决该错误时,如果您确实收到 ECONNREFUSED,则您知道要么没有具有该 IP 的主机,要么没有在该端口上侦听。不管怎样,发送也没有意义。

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

UDP sendto 上的 ECONNREFUSED 错误 的相关文章

  • 在 Android 上显示实时 UDP 或 RTP 流(组播)

    我刚接触 Android 开发几周 我需要编写一个应用程序 可以向用户显示以 UDP 或 RDP 多播的实时流 该流位于诸如 rtp 230 0 0 11 1234 之类的地址 并通过该模块通过 WIFI 发出 我已经尝试从播放器 Daro
  • Golang编写的UDP客户端无法接收来自服务器的消息

    我写了一个Java客户端 它向广播地址发送消息 我还编写了一个Java服务器 它接受所有发送的消息并将消息发送回客户端 现在我想尝试在 Go 中做同样的事情 只是为了获得一些经验 服务器工作正常 正在接收消息并对 Java 客户端做出响应
  • 在不使用环回网络的情况下将数据包转发到同一主机中的服务

    我有这个 libnetfilter queue 应用程序 它根据某些 iptables 规则从内核接收数据包 在直接讨论我的问题之前 我提供了一个示例可行代码和其他工具来设置测试环境 以便我们的问题定义和可能的解决方案可以更加准确和稳健 以
  • 播放 UDP 数据包中收到的原始 PCM 音频

    远程设备正在 UDP 数据包中发送实时原始 PCM 音频 不包含标头 我需要在 java 中实现一个程序来接收这些数据包并在 PC 上实时播放它们 据我所知 原始 PCM 的属性是 16 位 单声道 采样率 24KHz 因此我尝试向该原始
  • Android 无法通过互联网从 PC 服务器接收 UDP 数据

    我目前正在探索用Java 进行UDP 数据包传输 以在Android 上创建多人游戏 我使用通常的 127 0 0 1 成功地在 Nexus 4 内交换数据包 并且还成功地在本地网络中的 PC 服务器和 Android 客户端之间交换数据包
  • memcached 使用 Django 监听 UDP

    Question 我无法获得memcached正在听UDP 上班 get set delete 与姜戈 我只让 memcached 监听UDP 11211 正如我在上一个问题 https stackoverflow com question
  • 什么是 STUN?它是否需要端口转发服务器?

    我对没有基础服务器的 p2p 通信进行了一些研究 并通过了 STUN 据我所知 STUN 是 NAT 打孔 的一种方式 不需要对等方进行端口转发即可连接 这是正确的吗 打孔到底是什么意思 这一切看起来都很脆弱 因为如果不需要端口转发 它就会
  • UDP 服务器套接字缓冲区溢出

    我正在 Linux 上编写 C 应用程序 我的应用程序有一个 UDP 服务器 它在某些事件上向客户端发送数据 UDP 服务器还接收来自客户端的一些反馈 确认 为了实现这个应用程序 我使用了一个 UDP 套接字 例如int fdSocket
  • 简单的udp代理解决方案

    我正在寻找可以代理我的 udp 数据包的解决方案 我有一个客户端向服务器发送 udp 数据包 它们之间的连接非常糟糕 导致大量数据包丢失 一种解决方案是使用一个新的代理服务器 它将所有数据包从客户端重定向到目标服务器 新的代理服务器与这两个
  • 为什么我的 UDP 广播失败?

    我正在尝试发送 UDP 广播 但wireshark 没有报告任何流量 这是执行发送的代码片段 void SendBroadcast String ip 255 255 255 255 int port 30718 String messag
  • 我应该使用哪个高级 API 来管理 iOS 上的 UDP 套接字? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在章节 使用套接字和流 https developer apple com library mac d
  • 如果客户端在服务器之后启动,则 GStreamer v1.0 UDP 多播流无法正确解码

    我正在尝试使用 GStreamer 进行 UDP 多播屏幕流传输 我的投屏服务器应该在 Windows 上运行 and my 客户端应在 Linux 上运行 如果我在服务器之前启动客户端 一切都很好 问题是当我启动客户端并且服务器已经启动时
  • 为什么UDP服务器上的UDP客户端端口会改变

    我一直在关注一个简 单的 UDP 服务器 客户端教程 发现here http www binarytides com udp socket programming in winsock 我有一个关于客户端连接到服务器的端口的快速问题 仅从代
  • HTTP 是否使用 UDP?

    这可能是一个愚蠢的问题 HTTP 是否使用过用户数据报协议 例如 如果使用 HTTP 传输 MP3 或视频 它内部是否使用 UDP 进行传输 From RFC 2616 http www ietf org rfc rfc2616 txt 通
  • 将 Docker 容器连接到网络接口/设备而不是 IP 地址

    经过仔细的研究 测试和摆弄 我只能找到通过从 IP 端口转发来将 Docker 容器连接到给定接口的方法 这可以通过添加来完成 p Host IP Host Port Container Port to a docker run命令 我有一
  • Go:如何接收整个 UDP 数据报

    我的问题 使用 net Read 方法仅复制给定字节数组或切片大小的字节数 当然 我不想每次都分配最大 64 kB 的 UDP 数据报 有没有go如何确定数据报的大小 位于数据报头中 或再次读取直到数据报完全读取 Try 从UDP读取 ht
  • C#/Unity - 无法从异步方法调用 Unity 方法

    我正在使用Unity3D 这是我的异步方法 private void Receive IAsyncResult ar try IPEndPoint ipEndPoint null byte data udpClient EndReceive
  • 互联网上的 UDP 多播?

    我不确定如何最好地解决我的问题 我有一个在远程计算机上运行的服务 用于接收和处理 UDP 数据包 我希望该服务能够将这些数据包重新发送给任何需要它们的人 可能是任何人 通常是一台机器 但也可能更多 我认为 UDP 多播将是理想的 该服务可以
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • Rails 是否支持侦听 UDP 套接字的简洁方式?

    在 Rails 中 集成更新模型某些元素的 UDP 侦听过程的最佳方式是什么 特别是向其中一个表添加行 简单的答案似乎是在同一进程中使用 UDP 套接字对象启动一个线程 但不清楚我应该在哪里执行适合 Rails 方式的操作 有没有一种巧妙的

随机推荐

  • 带注释的代码风格[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我无法在两者之间做出决定 MyAnnotation param1 paramval public void foo and MyAnnotati
  • 将 CSS 属性排序为任意顺序?

    我想以编程方式将样式表中的所有声明 属性 不是声明块本身 而是每个块内的各个声明 排序为任意顺序 我已经能够在网上找到几种按字母顺序排序声明的方法 或者按字母顺序反向排序 甚至按字符串长度排序 但这对我来说没有帮助 因为这些排序方法本质上是
  • WPF - 为什么 ContextMenu 项目适用于 ListBox 而不是 ItemsControl?

    列表中的项目有上下文菜单 上下文菜单项绑定到路由命令 如果列表控件是一个 则上下文菜单项可以正常工作ListBox 但一旦我将其降级为ItemsControl它不再起作用了 具体来说 菜单项始终呈灰色 这CanExecute回调在我的Com
  • N Boost Interval_set 的组合

    我的服务在 4 个不同的地点出现中断 我将每个位置的中断建模为 Boost ICL Interval set 我想知道何时至少有 N 个地点发生主动中断 因此 以下这个答案 https stackoverflow com a 9430993
  • Typescript 编译错误:类型“Node”上不存在属性“classList”

    Windows 7 x64 使用 typescript 1 5 beta 使用 gulp typescript 2 7 7 进行编译 出现错误 由于语句 类型 Node 上不存在属性 classList document getElemen
  • 如何修复“OSError:[WinError 193] %1 不是有效的 Win32 应用程序”

    我正在努力与熊猫相处 我正在使用 Thonny 作为 IDLE 来学习 Python 我在 cmd 中使用 pip 命令安装了 pandas 不知何故 我无法在 IDLE 中导入 pandas 方法 因此我通过设置将其添加为包 问题是 当我
  • 自动在所有方法上设置断点

    有没有一种方法可以自动在 eclipse idea 中对给定类中的所有方法设置断点 在大纲视图 Eclipse 中 您可以选择所有方法 右键单击并选择 切换方法断点
  • C 中结构体和指针的 malloc

    假设我想定义一个表示向量长度及其值的结构 如下所示 struct Vector double x int n 现在 假设我想定义一个向量 y 并为其分配内存 struct Vector y struct Vector malloc size
  • 使用 lapply 对数据框列表应用函数并将输出保存到具有不同名称的文件

    我有一个数据框列表 并为列表中的每个元素 例如每个数据框 指定了名称 e g df1 lt data frame x c 1 5 y c 11 15 df2 lt data frame x c 1 5 y c 11 15 mylist lt
  • 如何编写给定代码的列表理解?

    我对 python 相当陌生 l for i in range x 1 for j in range y 1 for k in range z 1 if i k j n l append i j k 我尝试过 l i for i in ra
  • 我可以在 Django 中为每个用户创建子域吗

    我希望用户创建自己的帐户 并且用户应该拥有自己的帐户 例如 user foo com 并不同指向不同的模板文件夹 在 Django 中可以吗 我对 Django 很陌生 安德烈提供的答案并不完全正确 您确实需要一个通配符域名 大多数体面的提
  • PHP/MySQLi 中的多个 SQL 对象

    一段时间以来 我一直在 php 中使用多个 SQL 连接来避免 您现在无法运行此命令 命令不同步 错误 我似乎无法弄清楚何时只能使用一个连接以及何时需要多个连接 以下代码是我如何从彼此相关的不同表中检索内容的方法 The sqls 是连接到
  • Laravel、Faker - 增加生成的日期时间

    我在 Seeder 中使用 Faker 包来生成训练活动的假数据 每个活动都有starts at and ends at字段 我想填充ends at场与DateTime那是在生成的之后starts at 最好相差 1 到 8 小时 或者甚至
  • 从 Expo 应用程序调用本地托管服务器

    我正在创建一个反应本机应用程序 我创建的组件之一包含一个属性 该属性通过来自 http 请求的数据填充 现在 我通过笔记本电脑托管服务器 但我正在使用 Expo 应用程序在手机上测试该应用程序 由于这是两个独立的设备 http 本地主机 3
  • Unicode 和非 Unicode 之间的 SSIS 数据转换错误

    当我运行 ssis 包时 我收到此错误 无法在 unicode 和非 unicode 字符串数据类型之间转换 我的源是 Oracle 当我检查输出列数据类型时 它们都是 Unicode 字符串 DT WSTR 我的目标是 SQL输入列的数据
  • 为 iOS 项目编译 libtiff 以包含 64 位架构

    我有一个 iOS 应用程序更新到最新的 SDK8 3 并且我正在使用最新版本的 Xcode 我的应用程序使用 libtiff 将图像 PNG 格式 转换为 TIFF 格式 我遇到的问题是我需要向 App Store 提交新的修订版 并且需要
  • 在同一光标中访问订购的图像和视频

    我正在使用android content CursorLoader类创建两个Cursor对象访问存储在我的应用程序设备的用户上的媒体 我想为用户提供存储图像和视频的网格视图 以保留 Android Gallery 应用程序的顺序 目前我正在
  • 使用执行 SQL 任务的参数映射

    我正在尝试创建一个临时表并将数据插入到 foreach 循环容器内的执行 SQL 任务内的临时表中 这是sql任务 IF OBJECT ID TEMPDB DBO TEMP IS NOT NULL DROP TABLE TEMP GO CR
  • 将“for”循环的输出写入 PYTHON 中的 excel

    我有以下代码 my list US IT ES NL for i in my list A sum products by country world level i df pd DataFrame value A Descending d
  • UDP sendto 上的 ECONNREFUSED 错误

    我在使用正在写入的应用程序时遇到一些无法解释的行为 使用 sendto 向多个端口发送 UDP 数据 所有端口均使用套接字 PF INET SOCK DGRAM 0 为了一组客户端读取进程的利益 这些 sendto 偶尔会不可预测地触发经济