【发布时间】:2017-01-16 14:06:07
【问题描述】:
那么你如何正确地做到这一点呢?
我知道如何创建套接字,然后使用 ioctl 设置 IFF_PROMISC 标志(如“howto check a network devices status in C?”和其他地方所述),但这至少在理论上看起来是有缺陷的。
- 您通过 ioctl 读取标志
- 你更新标志
- 其他人修改了标志
- 您通过 ioctl 设置更新的标志
有没有更好的方法,还是我太担心了?
后来我发现应该像这样通过 setsockopt(也没有种族)向 PACKET_MR_PROMISC 添加接口:
void set_promisc(const char *ifname, bool enable)
{
struct packet_mreq mreq = {0};
int sfd;
int action;
if ((sfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1) {
perror("unable to open socket");
return;
}
mreq.mr_ifindex = if_nametoindex(ifname);
mreq.mr_type = PACKET_MR_PROMISC;
if (mreq.mr_ifindex == 0) {
perror("unable to get interface index");
return;
}
if (enable)
action = PACKET_ADD_MEMBERSHIP;
else
action = PACKET_DROP_MEMBERSHIP;
if (setsockopt(sfd, SOL_PACKET, action, &mreq, sizeof(mreq)) != 0) {
perror("unable to enter promiscouous mode");
return;
}
close(sfd);
}
不幸的是,这对界面没有任何影响,但如果我正确理解the doc,它应该会。可能是broken since 2001 (tm)? pcap 源中的评论也抱怨这一点。
【问题讨论】:
-
而为什么您认为
ioctl是错误的?什么是“更好更简单的方法”? -
读取/修改/写入标志操作应该是原子的。
标签: c linux network-programming