2013-06-12 22 views
0

我正试图找到一种方法,可以有效地更改运行我的程序的计算机的IP和网络掩码。我必须能够保持与用户有权访问的“盒子”的通信,并且可以更改该盒子的IP(但不是Linux主机的IP)。幸运的是,该框通过多播地址广播其IP。我能够读取该地址并与该广播箱的任何IP进行通信。但是,我的问题是,当这个盒子在Linux主机的子网之外改变IP时,我失去了连接(就像我期望的那样)。使用C/C++设置Linux IP

因此,我们需要一种快速和肮脏的方式来更改Linux主机的IP和网络掩码,当它检测到正在广播的IP在其子网之外时。我知道我可以修改/编辑/ etc/networking/interfaces文件,但我希望有一些“活”的地方,我不需要重新启动网络接口或Linux主机。另外,我想维护当前在更改期间打开的所有套接字。我的主要问题是我有大量的连接由其他应用程序运行,这些应用程序由于IP转换而不能被破坏。另外,如果可能的话,我希望避免在主机IP转换之后必须重做必须运行用于Linux的多播路由添加命令。

有什么我可以做,以满足这些要求?谢谢。

+0

如果你想保持当前的连接,最好确保在Linux中有两个NIC,一个用于常规流量,另一个用于连续变形以与难以捉摸的盒子进行通信。 – paxdiablo

+0

不幸的是,有问题的Linux主机系统是一个只有一个NIC容量的嵌入式系统。我不一定希望在转换期间保持连接,但我需要所有套接字以保持连接。我想避免必须找到一种方法将falg发送给我们需要重新初始化的所有打开的套接字。 –

+1

不知道你会得到多少运气。如果您的IP地址发生变化,则发往您原始IP的数据包可能会在bitbucket中结束。您可能想要考虑告诉客户您不支持更改难以捉摸的设备IP地址 - 有时候,非技术解决方案是最好的,他们当然很容易实现:-) – paxdiablo

回答

1

你不想更改接口的IP地址,你想添加一个额外的IP地址和子网到接口。在您的Linux系统文档中搜索IP Alias的功能。

Here's the HOWTO

+0

谢谢你,它看起来很有前途。在C/C++中是否有比在命令行命令中调用system()更清晰的实现? –

+0

你可以看看iproute2来弄清楚它是如何连接到内核的,但是我会猜测'system(“ip addr add 192.168.1.2/24 brd + dev eth0”)会容易得多 - 而且从长远来看,更易于维护。 – Casey