如何以编程方式确定将使用哪个源 IP 地址来到达给定的目标 IP 地址

How*_*May 4 c linux ip solaris routes

我有一个嵌入式应用程序,将部署在许多第三方系统上,我需要它来检查与其通信的每个目标地址是否使用了确定性和静态源 IP 地址(我知道它将与哪些目标 IP 地址通信)。

第三方必须保持自由地按照他们认为合适的方式实施他们的 IP 路由(同时遵守这些约束),我只需要检查它是否是确定性和静态的,并且最好知道它会是什么。

它是一个 C 应用程序,但可以在 Solaris 或 Linux 上运行。

我想这可能需要询问路由表?

有任何想法吗?

Var*_*gas 5

它对我来说的工作方式(在 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 );
Run Code Online (Sandbox Code Playgroud)

destination_address您想要到达的地址在哪里,source_address应该包含 IP 堆栈选择到达它的地址。