我有一个embedded式应用程序,将被部署在众多的第三方系统,我需要它来检查确定性和静态源IP地址是用于每个目标地址与它通信(我知道哪些目标IP地址它将与)。
第三方必须保持自由,以实现他们的IP路由感觉合适(同时遵守这些限制),我只需要检查它是确定性和静态的,理想地知道它会是什么。
它的一个C应用程序虽然可以在Solaris或Linux上运行。
我想这可能需要询问路由表?
有任何想法吗?
它适用于我(在Windows和Linux机器上)的方式是创建一个套接字SOCK_DGRAM
,并在此套接字上调用connect()
到所需的目标地址。 如果调用成功,然后调用getsockname()
来获取哪个本地地址将被使用,如果您通过此套接字发送数据。
有点像这样(基于工作代码,错误检查删除简洁):
const char * destination_address = "8.8.8.8"; sockaddr_storage Addr = { 0 }; unsigned long addr = inet_addr( destination_address ); ( ( struct sockaddr_in * ) &Addr)->sin_addr.s_addr = addr; ( ( struct sockaddr_in * ) &Addr)->sin_family = AF_INET; ( ( struct sockaddr_in * ) &Addr)->sin_port = htons( 9 ); //9 is discard port int Handle = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP ); socklen_t AddrLen = sizeof(Addr); connect( Handle, (sockaddr*)&Addr, AddrLen); getsockname(Handle, (sockaddr*)&Addr, &AddrLen); char* source_address = inet_ntoa(((struct sockaddr_in *)&Addr)->sin_addr); printf( "source address: %s\n", source_address );
当destination_address
是你想要到达的地址时, source_address
应该包含IP栈选择到达的地址。
我希望我能帮你解决
你必须说服这些第三方管理员添加一个额外的IP以太网端口(假设,只有一个)。 在您的C程序中,您可以使用bind()将套接字绑定到此IP地址。 发送的数据包将具有绑定的IP作为源地址。 我在Linux上使用它,但是Solaris也应该这样做。
我假设我们正在谈论传出连接。
应用程序bind()
的ip地址将成为正在使用的源地址。 所以它可以完全在应用程序的命令下使用哪个ip地址。
无论如何,在调用connect()
之前,应用程序可能会选择不关心在bind()
显式使用哪个ip地址。
路由不会更改源IP地址。
NAT(网络地址转换)另一方面确实改变了源IP地址。
做什么的? 如果我现在连接到您的服务,源IP将是192.168.0.14,由我的WiFi路由器提供。 如果我明天连接,可能是另一个,在星期一(在工作),又一个在10.0.10.xxx范围内。 请注意,每个人可以重复几千次(私人使用的192.168.0.xxx网络非常受家庭路由器的欢迎)。