SO_BINDTODEVICE
を使用してソケットをeth0にバインドしようとしています。私はeth0を変数opt
に渡しています。私のソケット名は、いくつかのデバッグを行うためにはsocketfd
SO_BINDTODEVICEを使用してインターフェイスにトラフィックバインドがありません
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if(sockfd < 0) {
perror("socket(): error ");
return 0;
}
struct ifreq ifr;
memset(&ifr, 0, sizeof(struct ifreq));
fprintf(stderr,ifr.ifr_name, sizeof(ifr.ifr_name), opt);
ioctl(sockfd, SIOCGIFINDEX, &ifr);
setsockopt(sockfd, SOL_SOCKET, SO_BINDTODEVICE, opt, strlen(opt));
fprintf(stderr, "The bind is done on interface %s \n", opt);
fprintf(stderr, "opt length is %zu \n", strlen(opt));
ですが、私はログファイルにOPTとはstrlen(OPT)の値をリダイレクトすることだし、彼らは正確な値を取得します。
猫
/home/cayman/log.txtバインドは、長さが、私はまた、eth0のが、私ドン上のパケットをキャプチャすることにより検証を行う4
ある
OPTインターフェースeth0上で実行されますeth0を通過するトラフィックは見えません。次のように表示されているものすべてが、他のネットワーク関連のトラフィックです:
tshark -i eth0
1 0.000000 Cisco_51:fd:09 -> Spanning-tree-(for-bridges)_00 STP 62 Conf. Root = 32768/78/00:24:50:51:fd:00 Cost = 0 Port = 0x8009
2 0.326720 192.168.78.1 -> 224.0.0.13 PIMv2 70 Hello
3 1.030538 Cisco_51:fd:09 -> Cisco_51:fd:09 LOOP 62 Reply
4 2.004544 Cisco_51:fd:09 -> Spanning-tree-(for-bridges)_00 STP 62 Conf. Root = 32768/78/00:24:50:51:fd:00 Cost = 0 Port = 0x8009
5 3.254223 192.168.78.1 -> 224.0.0.10 EIGRP 76 Hello
6 4.010168 Cisco_51:fd:09 -> Spanning-tree-(for-bridges)_00 STP 62 Conf. Root = 32768/78/00:24:50:51:fd:00 Cost = 0 Port = 0x8009
7 6.014839 Cisco_51:fd:09 -> Spanning-tree-(for-bridges)_00 STP 62 Conf. Root = 32768/78/00:24:50:51:fd:00 Cost = 0 Port = 0x8009
8 7.896252 192.168.78.1 -> 224.0.0.10 EIGRP 76 Hello
9 8.023003 Cisco_51:fd:09 -> Spanning-tree-(for-bridges)_00 STP 62 Conf. Root = 32768/78/00:24:50:51:fd:00 Cost = 0 Port = 0x8009
は私もthis threadに見ていたと私は私がスーパーユーザーとして私のコードを実行していることを確認しました。 SO_BINDTODEVICEのman pageも見ましたが、何が欠落しているのかわかりません。何か提案してください?
私は不思議です:どうしてソケットをeth0にバインドしていますか? –
私はUDPリダイレクト機能を実装しています。フロントエンド(eth0/eth1)のユーザーの入力に応じて、バックエンドはソケットをバインドしてトラフィックのリダイレクトを行います –