同时使用 INADDR_ANY 和特定 IP 绑定到同一端口

2024-01-25

python 中的一个简单实验(在 Windows 上)表明我能够同时绑定到通配符地址和特定地址上的同一端口:

import socket
import select

MY_PORT = 13337

sany = socket.socket()
sany.bind(('', MY_PORT))
sany.listen(0)

sloc = socket.socket()
sloc.bind(('127.0.0.1', MY_PORT))
sloc.listen(0)

socks = [sany, sloc]
ready, _, _ = select.select(socks, [], [])
print socks.index(ready[0])

从概念上讲,它们在应该涵盖的内容上有所重叠。连接到继续实验('127.0.0.1', 13337)来自不同的提示表明更具体的套接字“获胜”(即1被打印)。 我看到类似的行为SOCK_DGRAM插座。

我的问题如下:

  • 这种行为是否具有某种契约性(Winsock、Berkeley Sockets 等)?
  • 对于多播套接字来说,这应该如何表现?
  • 这在 *nix 系统上应该如何表现?

您所描述的内容在 Windows Server 2003 及更高版本上是可能的,但只有当两者bind()调用由同一用户帐户进行:

使用 SO_REUSEADDR 和 SO_EXCLUSIVEADDRUSE https://msdn.microsoft.com/en-us/library/windows/desktop/ms740621.aspx

Windows Server 2003 的发布增加了增强的套接字安全性。在以前的 Microsoft 服务器操作系统版本中,默认的套接字安全性很容易允许进程从毫无戒心的应用程序劫持端口。在 Windows Server 2003 中,默认情况下套接字不处于可共享状态。因此,如果应用程序想要允许其他进程重用已绑定套接字的端口,则必须专门启用它。如果是这种情况,在端口上调用绑定的第一个套接字必须在该套接字上设置 SO_REUSEADDR。这种情况的唯一例外是当第二次绑定调用由发出原始绑定调用的同一用户帐户执行时。此异常的存在只是为了提供向后兼容性。

下表描述了当第二个套接字尝试绑定到先前由第一个套接字使用特定套接字选项绑定到的地址时,Windows Server 2003 及更高版本的操作系统中发生的行为。

...

当在不同的用户帐户下进行套接字绑定调用时,套接字绑定行为会发生变化。下表指定了当第二个套接字尝试使用特定套接字选项和不同的用户帐户绑定到先前由第一个套接字绑定的地址时,在 Windows Server 2003 及更高版本的操作系统中发生的行为。

在早期的 Windows 版本中,行为有所不同:

下表描述了在 Windows XP 及更早版本中当第二个套接字尝试绑定到先前由第一个套接字使用特定套接字选项绑定的地址时发生的行为。

...

在第一次调用绑定设置 SO_REUSEADDR 的情况下或者根本没有套接字选项,第二个绑定调用将“劫持”端口,应用程序将无法确定两个套接字中的哪一个接收到发送到“共享”端口的特定数据包。

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

同时使用 INADDR_ANY 和特定 IP 绑定到同一端口 的相关文章

  • 使用 asyncore 读取网站

    我想异步阅读一个网站 据我所知 这是不可能的 urllib 现在我尝试使用普通套接字进行阅读 但是 HTTP 给我带来了麻烦 我遇到了各种时髦的编码 例如传输编码 分块 必须手动解析所有这些东西 我现在想编码 C 而不是 python 难道
  • 尝试从输入流检索文本时应用程序挂起

    情况 我确实查看了您的代码 正如我怀疑的那样 您的问题与您发布的代码完全无关 您的 GUI 完全忽略 Swing 线程规则 并在主 Swing 事件线程 称为Event Dispatch T螺纹或EDT 由于该线程负责所有 Swing 绘图
  • ZeroMQ可以用来接受传统的套接字请求吗?

    我正在尝试使用 ZeroMQ 重写我们的旧服务器之一 现在我有以下服务器设置 适用于 Zmq 请求 using var context ZmqContext Create using var server context CreateSoc
  • socket.error:[Errno 10054]现有连接被远程主机强制关闭(python2.7)

    我的套接字有问题 它运行良好 但是当我关闭客户端 关闭客户端窗口时 服务器丢失了连接 服务器需要保持打开状态并等待其他连接 while True rlist wlist xlist select select server socket o
  • Java心跳设计

    我需要在我的 Java 项目上实现一个心跳系统 3 5 个客户端和 1 个服务器 但我有一些问题 1 客户端需要有 2 个套接字吗 1 用于心跳 1 用于接收我的软件的正常消息 2 我看到在特定情况下 当客户端滞后时 客户端不会收到消息 如
  • java.net.ServerSocket.accept () 在 Android 上不返回

    我正在尝试找到一种方法来远程登录到未root的机器人 我有INTERNET权限处于活动状态 我的设备与我的设备连接在同一网络上Mac OS X通过 WiFi 我可以 ping 通我打开的端口 在最初的实验中 我让它在有根测试设备上工作 但我
  • Rails 应用程序中的持久 TCP 连接

    我有一个在服务器上运行的第三方应用程序 它对客户端进行身份验证并返回响应 我的问题是 对于我收到 Rails 应用程序的每个请求 我都需要建立 TCP 连接并获取数据 是否可以有一个持久连接 以便我可以减少建立连接的开销 我希望你使用的是
  • 如何在node.js中分离TCP套接字消息

    我正在尝试使用 TCP 套接字 并且对消息如何到达我的应用程序感到困惑 看来他们已经分手了 有人知道我怎样才能最好地将他们重新组合在一起吗 所有消息均以换行符分隔 r n var stream net createConnection po
  • 如何从 WinRT StreamSocket 读取所有可用数据并清空 inputStream?

    我想在向套接字写入新数据之前读取当前正在等待套接字的所有数据 WinRT中的读取方法都是异步的 所以我不能简单地while直到套接字为空 由于我确实想丢弃套接字上的数据 因此我不想使用读取器 而是直接从套接字读取数据IInputStream
  • 如果是 PrintWriter,为什么我应该在循环中刷新而不是在循环之后刷新?

    我的小演示程序中有一个服务器和客户端 我将一些字符串数据从客户端发送到服务器 然后为客户端重新发送这些数据 客户端也将其写入控制台 我对 PrtintWriter 的刷新方法感到困惑 根据 JAVA 文档 该方法刷新流 经过一些研究 我逐渐
  • 通过 SSLStream 发送数据时出现数据包碎片

    当使用 SSLStream 将 大 数据块 1 兆 发送到 已通过身份验证的 客户端时 我看到的数据包碎片 分解是FAR比使用普通 NetworkStream 时更大 在客户端上使用异步读取 即 BeginRead 会重复调用 ReadCa
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • gjs 如何使用 g_data_input_stream_read_line_async 在 Gnome Shell 扩展中读取套接字流

    我正在尝试编写一个 Gnome Shell 扩展 通过 Socket 服务器与 Arduino 进行通信 服务器和 Arduino 运行良好 但我陷入了监听传入服务器消息的扩展代码 因为我需要一种非阻塞方法 所以使用异步读取行 https
  • 获取2个IP地址之间的地理距离? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 如何计算 2 个 IP 地址之间的地理距离 例如 500 英里 有没有一些API可以让你查这个 这可能是您将得到的最接近的结果 谁提供 WH
  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • 序列化是通过套接字发送数据的最佳选择吗?

    有人告诉我 序列化不是通过套接字发送数据的最佳方法 但他们说他们在一本书上读过一次 并且不确定更好的方法 因为他们以前没有真正做过网络 那么序列化是最好的方法还是有更好的方法 如果这有很大的不同的话 这也是一个游戏 通过搜索有关通过它发送对
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • Socket.io 400(错误请求)

    我的服务器上有这段代码 var express require express var routes require routes var user require routes user var http require http var
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 我在socket上设置了超时,发现这个值不能大于21

    我在socket上设置了超时 该值小于21秒才有效 21秒后发现超时还是21秒 public static void main String args SimpleDateFormat sdf new SimpleDateFormat yy

随机推荐

  • VB.Net 中的只读局部变量

    这是一个非常简单的问题 我很惊讶我必须问它 但是 如何在 VB Net 中声明只读局部变量 Java 和 C 有 Final const 局部变量 所以我确信 VB Net 一定有它们 但我就是找不到它的语法 不幸的是 VB NET仅支持只
  • Android 保存游戏状态

    我不确定应该如何保存我正在开发的游戏的游戏状态 我应该保存包含所有游戏信息的实例 对象吗 如果是 怎么办 或者我应该将所有相关信息保存在 txt 文件中并在需要时保存 加载信息 您是如何做到这一点的 您对我的建议有何看法 除非将实例 对象序
  • 如何在postgres中将整数分钟转换为间隔

    我正在尝试将整数分钟转换为 postgres 中的间隔 是否有任何函数可以帮助我将其转换为间隔 或者我应该将其除以 60 并得到最终结果 20 minutes will be like 00 20 00 as result 最快的方法是与m
  • Firefox 和 Chrome 中的文本区域填充不一致

    我的文本区域元素上有填充 我希望当您在文本区域内滚动时内容保持填充状态 它在 Firefox 中按预期工作 但在 Chrome 中却不然 下图显示了输出的差异 CSS textarea width 250px height 160px pa
  • 在 C++ 中计算字符串的算术表达式[重复]

    这个问题在这里已经有答案了 我正在寻找一种简单的方法来计算字符串中的简单数学表达式 如下所示 3 2 4 1 4 9 6 我只是想 and 运营加 and 迹象 和 优先级高于 可以尝试一下 http partow net programm
  • 为什么 CV::Mat 图像的颜色空间错误(GBR 而不是 RGB 或 BGR)?

    我有一个 Python 模块 它将 RGB 发送到 C 并在那里被消耗 然而 无论我做什么 图像都有错误的色彩空间 那是我试图将其转换为RGB 假设它仍然在 BGR 中 尽管在 python 中它故意通过执行以下操作转换为 RGB retu
  • 在 C# 中使用反应式扩展时如何显示进度

    我在 C 中使用反应式扩展来执行一些计算 这是我的代码到目前为止的样子 我尝试将代码包装起来 以便在计算方法中执行一系列任务时可以显示进度 这是可观察到的 IObservable
  • LINQ 表达式语法如何与 Include() 一起使用以进行预加载

    我在下面有一个查询 但我想执行 Include 来急切加载属性 Actions 有一个导航属性 User Action User 1 我的基本查询 from a in Actions join u in Users on a UserId
  • 在使用 SQL Server 数据库邮件创建的电子邮件中嵌入图像

    我正在仅在 SQL Server 中开发电子邮件解决方案 该解决方案将使用数据库邮件发送 HTML 格式的电子邮件 问题是 HTML 中的图像需要嵌入到外发电子邮件中 如果我使用 net 应用程序来生成和发送电子邮件 这不会成为问题 但不幸
  • 用于验证带扩展名的 Windows 和 Linux 路径的正则表达式

    我正在尝试编写一个函数 该函数将验证给定路径在带有文件扩展名的 Linux Windows 中是否有效 ex Windows路径 D DATA My Project 01 07 03 061418738709443 docLinux路径 s
  • PHP 中的文件夹作为参数

    我想创建一个脚本 将网站中请求的每个文件夹作为参数传递 例如 如果有人请求 www example com foo 这将被重定向到主index php并作为参数传递 在请求时得到相同的结果www example com index php
  • Java中如何实现并发读取映射到内存的文件?

    我有很多线程同时读取同一个文件 总共大约100M 并且只有一个线程更新文件 我想将文件映射到内存中以减少FILE I O 在 Java 中如何做到这一点 我基本上考虑了以下2种方法 用字节数组存储文件 多线程读取时每次创建ByteArray
  • 为什么 CarPlay 在真车上会崩溃?

    我有一个音频应用程序并已实现 CarPlay 我已按照本指南添加 CarPlay 支持 https blog fethica com add carplay support to swiftradio https blog fethica
  • 您在开发中如何处理 SSL?

    我有一个应用程序 它的一些路由与ssl 要求 http github com rails ssl requirement插入 它已部署并且在生产中运行良好 问题是如何在开发中最好地处理这个问题 因为目前我只是简单地破解我的routes rb
  • 使用php从h1标签获取所有值

    我想接收一个包含文本中所有 h1 标签值的数组 例如 如果给定的输入字符串 h1 hello h1 p random text p h1 title number two h1 我需要接收一个包含以下内容的数组 titles 0 hello
  • SQL Reporting Services - Mozilla 中未显示打印按钮

    我在用SQL 报告服务 它工作正常并显示打印按钮IE 但在 Mozilla Firefox 中未显示 有人有什么主意吗 我已经检查过这个解决方案 但它不起作用 http social msdn microsoft com Forums en
  • 网络直径是什么意思?

    上图所示这个链接 http en wikipedia org wiki Vertex 28graph theory 29的 具有 6 个顶点和 7 个边的图 其中最左侧的 6 号顶点是叶顶点或下垂顶点 有直径4吗 对还是错 定义是 图的直径
  • Sequelize关系查询返回重复数据

    我正在使用 Sequelize 关系查询指定客户的客户订单 index js var results2 await customerService getOrders 1 console log results2 服务 js exports
  • Firefox 中的大子字符串比 Chrome 快约 9000 倍:为什么?

    基准 http jsperf com substringing http jsperf com substringing 因此 我正在启动我的第一个基于 HTML5 浏览器的客户端项目 本质上 它必须将非常非常大的文本文件解析为一个或多个对
  • 同时使用 INADDR_ANY 和特定 IP 绑定到同一端口

    python 中的一个简单实验 在 Windows 上 表明我能够同时绑定到通配符地址和特定地址上的同一端口 import socket import select MY PORT 13337 sany socket socket sany