c - 提供指定 NIC、确定子网上 IP 的选项的最佳方式?

标签 c networking posix

我正在编写一个 C 库,其中涉及告诉子网上的其他计算机向我发送消息。因此我必须向他们公布我的IP地址。该库应该可以在 Linux、OS X 和 Windows 上运行。目前我主要考虑的是 POSIX 层。

鉴于一台计算机可以有多个地址(例如,如果它有多个网络接口(interface)),

  1. 查找我的默认 IP 地址的最佳方式是什么(例如,在最简单、最常见的情况下,计算机与子网只有一个连接。)目前,我正在循环浏览系统网卡使用 getifaddrs 并返回第一个关联的网卡(优先选择非环回),但我认为这可能还不够。

  2. 什么是允许库用户选择在哪个接口(interface)上发送的良好 API?我假设对计算机的 NIC 和 IP 进行某种枚举,然后按名称选择 NIC 并查找其 IP。但从用户的角度来看,这似乎相当复杂。给定子网上另一台计算机的 IP,也许有某种方法可以通过网络掩码确定系统到子网的路由?不过,我不知道该怎么做。

对于2,我们最终可以假设可能有一个GUI或命令行选项允许用户选择NIC,但总的来说我想让它尽可能简单地自动告诉其他计算机如何定向UDP向其发送消息。

欢迎任何意见,谢谢!

最佳答案

如果您已经使用 IP 与其他计算机进行通信,则数据包将已经宣布一个返回地址,远端可以使用该地址来确定其消息应发送到的位置。

尝试推断要使用的正确接口(interface)地址并将其嵌入到消息中并不是一个好主意,原因有四个(可能更多)。首先,您最终将重新实现操作系统为弄清楚如何路由出站数据包而执行的所有逻辑。其次,如果路由表在您做出决定的时间和您实际需要连接到其他计算机并告诉它们将流量发送到哪里的时间之间发生变化,那么您将向它们发送错误的地址。第三,目标计算机可能并不总是位于同一子网上,在这种情况下,所有接口(interface)都不会匹配。第四,如果数据包在您和目的地之间经历任何形式的重写(例如 NAT),执行此操作的软件将不知道它需要深入到您的数据包中,并且远端的系统将不会使用正确的地址。

关于c - 提供指定 NIC、确定子网上 IP 的选项的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874409/

相关文章:

Android 网络位置提供商问题

android - 使用 2g 网络创建移动应用程序

c++ - 将 Linux 打开、读取、写入、关闭功能转换为在 Windows 上工作

linux - POSIX/Linux 可以完全取消链接文件条目吗?

c - 如何使用 eof 计算字符串的字母数 (ansi c)

c - 如何将 LSB 提取的数据转换为文本或二进制转换为文本

javascript - node.js - 使用 socket.io 在公共(public) IP 上托管服务器

c - 后台进程和挂起进程 - 在 C 中实现作业控制 Shell

c - 与 glibc 有何关系?

c - 有没有一种标准化的方法来解析 C 中的命令行参数?