perl 如何选择“正确的”套接字来发送数据报响应?

jxct1oxe  于 2022-11-15  发布在  Perl
关注(0)|答案(1)|浏览(151)

我有一些Perl代码,它通过select侦听套接字数组以获取请求,然后其他一些例程在经过大量处理后发出响应。
现在的问题是(假设我有对等体的地址$dest):我应该如何选择“正确”的套接字来向$dest发送响应?
我应该盲目地使用接收请求的套接字,还是应该尝试复制路由逻辑来找到“最佳”套接字,考虑每个套接字绑定到的地址,以某种方式将其与$dest进行比较?
不幸的是,我对后者没有什么想法。
我忘记了一个特殊情况(实际上在现有代码中触发了这个问题):
在可以设置响应之前,接收请求的套接字可能会减少侦听套接字的数组;因此我似乎需要实现第二种选择。

nbewdwxp

nbewdwxp1#

对于 与 给定 对等 方 的 所有 通信 , 应 使用 相同 的 套接 字 。
有些 时候 这 并 不 重要 , 但 有些 时候 它 确实 重要 。
也 就是 说 , 你 可能 只 应该 有 插座 。
当 你 从 一 个 UDP 套接 字 接收 时 , 你 被 赋予 了 这个 套接 字 起源 的 地址 和 端口 。 [ 1 ] 这 允许 一 个 套接 字 与 许多 其他 套接 字 通信 。
例如 ,
假设 服务 器 S 的 套接 字 是 0.0.0.0:1111 , 其 IP 地址 之 一 是 1111 。
Say client A's socket is 0.0.0.0:2222 and say it uses IP address 2.2.2.2 to reach 1.1.1.1.
Say client B's socket is 0.0.0.0:3333 and say it uses IP address 3.3.3.3 to reach 1.1.1.1.
当 服务 器 调用 recv 时 , 它 将 返回 2222:2222 或 3333:3333 ( 以 " 打包 " 形式 ) , 这 取决 于 是 A 还是 B 发送 了 消息 。 这 使 服务 器 能够 知道 谁 在 与 它 通信 , 以及 在 回复 时 使用 什么 地址 。
在 TCP 环境 中 , 服务 器 可能 将 每个 连接 的 数据 保存 在 以 客户 端 套接 字 ( accept 返回 的 套接 字 ) 为 键 的 哈希 中 ; 但 在 UDP 环境 中 , 类似 的 服务 器 可以 将 每个 连接 的 数据 保存 在 以 recv 返回 的 字符 串 为 键 的 哈希 中 。
这 说明 了 为什么 总是 使用 同一 个 套接 字 来 发送 和 接收 消息 很 重要 的 一 个 原因 。 如果 你 从 不同 的 套接 字 开始 发送 , 这个 哈希 查找 将 失败 。
在 一 种 情况 下 , 您 需要 多 个 套接 字 , 即 您 需要 侦听 部分 而 非 全部 网络 接口 。 例如 , 您 可能 需要 侦听 环 回 适配 器 ( 127.0.0.1 ) 和 用于 与 VM 通信 的 虚拟 适配 器 ( x.x.x. x ) , 但 不 需要 侦听 WiFi 适配 器 ( y.y.y. y ) 或 以太 网 适配 器 ( z.z.z. z )
套接 字 可以 侦听 所有 接口 ( 通过 绑定 到 IPADDR _ ANY ( 0.0.0.0 ) , 这 是 默认 设置 ) , 也 可以 侦听 一 个 接口 。 因此 , 要 侦听 ( 仅 ) 两 个 接口 , 需要 将 一 个 套接 字 绑定 到 其中 一 个 接口 ( 127.0.0.1 ) , 将 另 一 个 套接 字 绑定 到 另 一 个 接口 ( x.x.x. x ) 。
在 这里 , 使用 正确 的 套接 字 非常 关键 。 从 绑定 到 环 回 适配 器 的 套接 字 发送 的 消息 不会 到达 VM , 而 从 绑定 到 VM 适配 器 的 套接 字 发送 的 消息 也 不会 到达 环 回 适配 器 。
1.您 将 获得 数据 包 提供 的 地址 和 端口 作为 源 地址 和 端口 。

相关问题