提供指定NIC的选项的最佳方法,确定子网上的IP?

时间:2010-10-06 15:53:19

标签: c networking posix

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

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

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

  2. 允许图书馆用户选择发送哪个界面的优秀API是什么?我假设某种枚举计算机的NIC和IP,然后按名称选择NIC并查找其IP。从用户的角度来看,这似乎相当复杂。考虑到子网上另一台计算机的IP,也许通过网络掩码确定系统到子网的路由的某种方法?不过,我不知道该怎么做。

  3. 对于2,我们最终可以假设可能有GUI或命令行选项允许用户选择NIC,但一般情况下我想尽可能简单地让它自动告诉其他计算机如何指向UDP消息给它。

    任何意见表示赞赏,谢谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

1。默认IP地址

主机的默认IP地址实际上并不存在。通常,虽然大多数主机都配置了一个默认路由,操作系统决定使用该路由,如果找不到,通过查看路由表和数据包的目标IP地址,另一个接口发送数据包。这个接口将有一个IP地址,我想你可以认为它是默认的IP地址。但是,在多宿主主机的情况下,使用的源IP地址取决于ip头中的目标IP地址,并且由操作系统与路由表一起计算出来。这就是为什么没有默认IP地址的原因。即使您确实使用了与默认路由关联的IP地址,并告诉其他主机的用户有关此地址的信息,也没有任何关于从其端到您的主机的数据包将到达的信息,因为它们的主机可能位于不同的子网上(即无法通过默认路线访问。)

2。路由API:

这听起来像是要在应用程序级别实现某种路由。这个逻辑是操作系统在决定发送数据包的位置时所处理的,所以我认为你不需要实现它。

3。广告服务和mDNS:

如果您知道其他主机位于同一子网上,请查看mDNS(mulitcast dns)。这将允许您广告主机具有的服务(IP地址,端口号)以及联系同一多播组的其他主机可以发现此信息。 avahi是mDNS的一个实现。