宛先アドレスから、使用されるエンドポイントを推定する方法について調査した。
- UNIX
- 経路制御ソケット (AF_ROUTE を利用する方法) これはスーパーユーザ権限が必要
- sysctl を利用して、経路情報を読み取る(AF_ROUTEを使用)方法
- Windows
- GetBestInterface() APIを利用する方法
などが存在する。
経路制御ソケットは、スーパーユーザ権限が必要なので、コンポーネントをrootユーザで実行するかsetuidするなどしなければいけないので現実的ではない。
また、sysctlについては、OS依存の可能性がある(らしい)ので、少々難しいかも知れない。
別の方法として、UNIX では route コマンド(Linuxではipコマンド)を利用する方法がある。
freebsd> route get 192.168.111.1
route to: 192.168.111.1
destination: 192.168.111.1
interface: le0
flags: <UP,HOST,DONE,LLINFO,WASCLONED>
recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire
0 0 0 0 0 0 1500 1112
linux$ ip route get 192.168.111.1
192.168.111.1 dev eth0 src 192.168.111.130
cache mtu 1500 advmss 1460 hoplimit 64
宛先アドレスを与えると、利用されるインターフェース名(le0)もしくはエンドポイントアドレスが得られる。
とりあえず、coil において、
/*!
* @if jp
* @brief 宛先アドレスから利用されるエンドポイントアドレスを得る
* @else
* @brief Getting network interface name from destination address
* @endif
*/
bool dest_to_endpoint(std::string dest_addr, std::string& endpoint)
という関数を、posixではroute(もしくはip)コマンドを利用して、WindowsではGetBestInterface関数を利用して実装した。