gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:09:51 24 4
gpt4 key购买 nike

我有一个嵌入式应用程序,它将部署在许多第三方系统上,我需要它来检查确定的静态源 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 堆栈选择到达它的地址。

关于c - 如何以编程方式确定将使用哪个源 IP 地址到达给定目标 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14398099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com