【问题标题】:How to open raw UDP socket in promiscuous mode?如何在混杂模式下打开原始 UDP 套接字?
【发布时间】:2013-09-06 20:50:42
【问题描述】:

我正在尝试打开一个原始套接字来处理 流量。我需要它是混杂的。我查看了很多资源,但我完全感到困惑。 这是我的代码:

char interface_name[12];
strcpy(interface_name, "eth1");
sd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
if ( sd == -1 ) {
    perror("error in opening socket.");
    return;
}

if ( setsockopt(sd, SOL_SOCKET, SO_BINDTODEVICE, interface_name, strlen(interface_name)) == -1 )
{
    perror("error in binding sd.");
    return;
}
int one = 1;
if ( setsockopt (sd, IPPROTO_IP, IP_HDRINCL, &one, sizeof(one)) < 0)
{
    perror("error in setting HDRINCL.");
    return;
}
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strcpy(ifr.ifr_name, interface_name);
if (ioctl(sd, SIOCGIFINDEX, &ifr) < 0) {
    perror("ioctl(SIOCGIFINDEX) failed");
    return;
}
int interface_index = ifr.ifr_ifindex;
ifr.ifr_flags |= IFF_PROMISC;
if( ioctl(sd, SIOCSIFFLAGS, &ifr) != 0 )
{
    perror("ioctl for IFF_PROMISC failed.");
    return;
}
struct packet_mreq mr;
memset(&mr, 0, sizeof(mr));
mr.mr_ifindex = interface_index;
mr.mr_type = PACKET_MR_PROMISC;

if (setsockopt(sd, SOL_PACKET, PACKET_ADD_MEMBERSHIP, &mr, sizeof(mr)) < 0) {
    perror("setsockopt(PACKET_MR_PROMISC) failed");
    return 1;
}

最终的setsockopt() 失败并显示错误消息“协议不可用”
可能是什么原因?有什么建议吗?

【问题讨论】:

    标签: udp c linux sockets network-programming raw-sockets


    【解决方案1】:

    这是因为您使用了SOL_PACKET,它仅用于packet(7) 套接字。对于原始的INET 套接字,您不需要该选项。

    【讨论】:

    • 那部分是从一个 AF_PACKET 示例中采用的,现在我记得了。好的。那么如何将 AF_INET 套接字置于混杂模式?
    • @Ramazan 但是你真的把它设置在套接字上吗?你不是在界面上设置的吗(你已经这样做了)?
    • 我试过没有最后的setsockopt,但这次我无法接收数据包。但是,如果我将我的套接字更改为数据包套接字,并保留最终的 setsockopt,那么我可以接收数据包。我必须使用数据包套接字吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-28
    • 2012-08-24
    • 2016-08-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2019-04-09
    • 2011-08-29
    相关资源
    最近更新 更多