Raw Socket混杂模式不会嗅到我写的东西

Jos*_*a B 5 c c++ sockets ethernet sniffing

我在混杂模式下编写一个带有Raw Socket的程序,我需要原始套接字不要嗅探我发送的数据包.我只需要通过以太网rx线(而不是tx线)读取数据.这是可能的吗?

非常感谢.

Jos*_*a B 6

解决方案是查看读取数据包是否为PACKET_OUTGOING.使用此选项,您可以区分放在以太网tx线路中的数据包和从rx线路读取的数据包.

以混杂模式打开Socket:

char* i = "eth0";
int fd;
struct ifreq ifr;
struct sockaddr_ll interfaceAddr;
struct packet_mreq mreq;

if ((fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))) < 0)
    return -1;

memset(&interfaceAddr,0,sizeof(interfaceAddr));
memset(&ifr,0,sizeof(ifr));
memset(&mreq,0,sizeof(mreq));

memcpy(&ifr.ifr_name,i,IFNAMSIZ);
ioctl(fd,SIOCGIFINDEX,&ifr);

interfaceAddr.sll_ifindex = ifr.ifr_ifindex;
interfaceAddr.sll_family = AF_PACKET;

if (bind(fd, (struct sockaddr *)&interfaceAddr,sizeof(interfaceAddr)) < 0)
    return -2;


mreq.mr_ifindex = ifr.ifr_ifindex;
mreq.mr_type = PACKET_MR_PROMISC;
mreq.mr_alen = 6;

if (setsockopt(fd,SOL_PACKET,PACKET_ADD_MEMBERSHIP,
     (void*)&mreq,(socklen_t)sizeof(mreq)) < 0)
        return -3;
//...
Run Code Online (Sandbox Code Playgroud)

并阅读.现在,我们可以区分Rx和Tx以太网线:

unsigned char buf[1500];
struct sockaddr_ll addr;
socklen_t addr_len = sizeof(addr);
n = recvfrom(fd, buf, 2000, 0, (struct sockaddr*)&addr, &addr_len);
if (n <= 0)
{
    //Error reading
}
else if (addr.sll_pkttype == PACKET_OUTGOING)
{
    //The read data are not writing by me.
    //Use only this data to copy in the other network.
}
Run Code Online (Sandbox Code Playgroud)

这就是全部.使用它我不读我写的数据.当我将网络1帧复制到网络2并且网络2帧复制到网络1时,我避免了循环.