将 getaddrinfo() 与 AI_PASSIVE 一起使用

2023-11-24

The getaddrinfo()理论上,该函数不仅允许客户端程序有效地找到正确的数据来创建给定主机的套接字,而且还允许服务器绑定到正确的套接字。

I just 了解到这一点并开始通过 Python 尝试它:

from socket import *
for i in getaddrinfo(None, 22, AF_UNSPEC, SOCK_STREAM, IPPROTO_IP, AI_PASSIVE): i

yields

(2, 1, 6, '', ('0.0.0.0', 22))
(10, 1, 6, '', ('::', 22, 0, 0))

是什么让我想知道是否出了什么问题。

我到底应该用这些答案做什么?我是不是该

  • make a listen()荷兰国际集团所有这些答案的套接字,或者我应该
  • 只选择第一个真正有效的吗?

中的示例manpage建议我只采用第一个,如果它没有错误就对它感到满意,但在我的示例中我只能通过 IPv4 获得连接。

但如果我尝试所有这些,我必须担心 2 个服务器套接字,这是不必要的,因为如果满足某些条件(操作系统、套接字标志等),IPv6 服务器套接字也会侦听 IPv4。

我哪里想错了?


编辑:显然,我没有想错,但我的电脑做了错误的事情。我使用默认的/etc/gai.conf随 OpenSUSE 一起提供。如果有人能指出我正确的方向,那就太好了。

编辑2:在给定的情况下,strace阅读后给出以下内部调用/etc/gai.conf(现在使用端口54321,因为我认为使用端口22可能会产生一些不好的影响,但事实并非如此):

socket(PF_INET6, SOCK_DGRAM, IPPROTO_IP) = 3
connect(3, {sa_family=AF_INET6, sin6_port=htons(54321), inet_pton(AF_INET6, "::", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(38289), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
connect(3, {sa_family=AF_UNSPEC, sa_data="\0\0\0\0\0\0\0\0\0\0\0\0\0\0"}, 16) = 0
connect(3, {sa_family=AF_INET, sin_port=htons(54321), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
getsockname(3, {sa_family=AF_INET6, sin6_port=htons(60866), inet_pton(AF_INET6, "::ffff:127.0.0.1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, [28]) = 0
close(3)                                = 0

显然,该决定是根据调查结果做出的。getsockname()打电话...

BTW: https://bugs.launchpad.net/ubuntu/+source/eglibc/+bug/673708那里提到的其他错误报告证实了我的观察。那里有几个人声称新行为是正确的,所以我显然坚持使用AF_INET6... :-(


Your getaddrinfo由于某种原因返回错误的结果。它应该首先返回 IPv6 套接字。我唯一能想到的是,如果您的操作系统检测到您的系统具有低优先级 IPv6(6to4 或 Teredo)并避免它们,在我看来,在这种情况下是错误的。编辑:刚刚注意到我自己的电脑也做了同样的事情,我使用 6to4。

但是,您可以同时听它们,或者使用AF_INET6代替AF_UNSPEC。然后你可以执行setsockopt来禁用IPV6_V6ONLY.

getaddrinfo 在这里做了合理的事情并返回所有适用的结果(尽管顺序错误,正如我提到的)。一个和两个监听套接字都是有效的方法,具体取决于您的应用程序。

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

将 getaddrinfo() 与 AI_PASSIVE 一起使用 的相关文章

  • 从套接字读取 C HTTP

    我想知道如何判断是否已从套接字接收到所有数据 这是一个简单的网络代理 现在我正在处理请求部分 所以发送的内容应该以 r n r n 结尾 我不知道请求会持续多久 我在这里读过一些帖子 说我应该检查读取函数是否返回 0 但其他人说0只在客户端
  • Java Servlet 中限制 HTTP 请求

    在 java servlet 中 如何根据客户端的 IP 地址限制来自用户的 http 请求 我不想每秒处理来自特定源 IP 地址的超过 X 个请求 其中 X 是可配置的并且具有 0 1 中的实际值 10 范围 从 10 秒内 1 个请求到
  • socketcan如何处理仲裁?

    我非常了解 CAN 协议的工作原理 当两个节点尝试同时使用网络时 较低 id 的 CAN 帧会获得优先级 而另一个节点会检测到这一点并停止 当使用 socketcan 时 这似乎被抽象化了 我们只需像任何文件描述符一样写入和读取 我可能误解
  • Silverlight 套接字:模仿框架 Bind、Listen 和 Accept 方法?

    我有这个 NET Framework C 类 它实际上充当 TCP 连接的包装器Socket http msdn microsoft com en us library attbb8f5 aspxSystem Net Sockets 命名空
  • Python - 将整数或字符串发送到 Spark-Streaming

    我可以通过 CSV 文件发送我的数据 首先 将我的随机数写入CSV文件然后发送 但是可以直接发送吗 我的套接字代码 import socket host localhost port 8080 s socket socket socket
  • 具有非阻塞或多线程功能的 Ruby Tcp Server 类

    找不到任何可以帮助创建非阻塞 多线程服务器的 gem 或类 哪里可以找到 The Ruby 文档 http ruby doc org core classes Socket html M002091关于套接字有一些很好的例子 使用该页面中的
  • C# 套接字数据报溢出

    我是 C 新手 我有一个关于udp套接字的小问题 我有一个聊天服务器 它接收特定结构的数据包 udp 数据报 为什么程序在套接字缓冲区已满时才接收数据 难道以后的一切就不应该失去吗 也许会出现数据包碎片 数据包结构 udp headers
  • 如何使用 netcat 发送文件并保持连接?

    我发出命令 netcat serveraddress myport lt MY FILE 问题是 一旦文件发送完毕 netcat 就会发送一条消息来关闭连接 发送该文件后 我需要从控制台写入消息 我记得对标准输入做了一些事情 是这样的吗 n
  • winsock 和 BSD 套接字实现之间的差异

    Winsock 和 nix BSD 套接字实现之间的主要区别是什么 你可能想看看here http tangentsoft net wskfaq articles bsd compatibility html 为此 我要放弃一个区别 win
  • SO_BINDTODEVICE Linux 套接字选项的问题

    我有一台带有两个网卡的电脑 一 eth0 用于 LAN 互联网 另一个用于与一个微控制器设备进行 UDP 通信 微控制器有一个 IP 192 168 7 2 和一个 MAC 地址 第二个电脑网络适配器 eth1 有 192 168 7 1
  • Flask / Werkzeug - 套接字卡在 CLOSE_WAIT 中

    我遇到过一种情况 API 构建于Flask 宁静 https github com flask restful flask restful间歇性变得无反应 目前它从 Werkzeug 运行 我知道它仅用于非生产用途 并且是单线程的 让事情变
  • 保持 WebSocket 连接处于活动状态

    我正在研究 WebSocket 协议 并尝试在后端使用 Python 实现一个简单的 ECHO 服务 它似乎工作正常 但连接建立后立即断开 这是我的客户
  • 如何使用 HTML5 与 UDP 套接字通信?

    我拥有的 正在运行的 C 应用程序服务器 准备将数据发送到应该发送到 HTML5 页面或应用程序的客户端 我想要的是 考虑到 c 服务器和 HTML5 应用程序都是系统本地的 有没有办法使用 udp 端口 与 HTML5 进行通信 我知道的
  • 当我退出应用程序时,如何删除 UNIX 域套接字文件?

    我有一个服务器应用程序 它在特定路径中创建一个 UNIX 域套接字 其名称和bind 到它 仅当我有意从应用程序代码中关闭 停止应用程序时 我才需要删除套接字 否则需要打开 我该怎么做呢 Thanks Edit 考虑一下我从终端内部启动并运
  • Android设备到PC的socket连接

    我面临着建立从 Android 设备到 PC 的特定端口的套接字连接的问题 例如8080 我只想创建一个套接字 它将连接到特定端口并在该端口上写入一些数据流 我为此目的编写了一些代码 但代码给了我一个例外 TCP Error java ne
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • 通过套接字的身份验证方法

    我正在尝试通过套接字进行身份验证sailsjs and passport 挑战似乎在于套接字连接没有会话 并且 sailsjs 模拟请求对象 导致它没有 Passport 中间件设置 这导致nodejs抛出一个错误 说req对象没有调用的方
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因

随机推荐