简体   繁体   English

如何以混杂模式打开原始UDP套接字?

[英]How to open raw UDP socket in promiscuous mode?

I am trying to open a raw socket to deal with traffic.我正在尝试打开一个原始套接字来处理流量。 I need it to be promiscuous.我需要它是混杂的。 I have looked at lots of resources but I am totally confused.我查看了很多资源,但我完全困惑。 Here is my code:这是我的代码:

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;
}

The final setsockopt() fails with error message "Protocol not available" .最后的setsockopt()失败并显示错误消息"Protocol not available"
What could be the reason?可能是什么原因? Any suggestion?有什么建议吗?

It's because you use SOL_PACKET which is only used for packet(7) sockets.这是因为您使用了仅用于packet(7)套接字的SOL_PACKET For raw INET sockets, you don't need that option.对于原始INET套接字,您不需要该选项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM