它对我来说的工作方式(在 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 堆栈选择到达它的地址。