私にとって(WindowsとLinuxの両方のマシンで)機能する方法は、 socket を作成し、このソケットで目的の宛先アドレスを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 スタックが到達するために選択したアドレスが含まれている必要があります。