c++ - 原始套接字混杂模式不嗅探我写的东西

标签 c++ c sockets ethernet sniffing

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

非常感谢。

最佳答案

解决方案是查看读取的数据包是否为 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;
//...

并阅读。现在,我们可以区分 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.
}

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

关于c++ - 原始套接字混杂模式不嗅探我写的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12177708/

相关文章:

linux - 通过 TCP 快速发送/接收数据会导致阻塞

c - c语言socket编程问题

python - 使用多线程的基本套接字聊天程序会引发错误

c++ - 为什么我可以将数组的大小设置为等于 vector 的(未知)大小?

c++ - 编译时指向函数错误的指针

c++ - C++ 中的多重虚拟继承提示特定函数调用

c++ - 无法在 CMake 中创建动态库并将其链接到另一个动态库?

c - stdarg.h 不处理字符指针

c - 使用信号量同步进程

c - free() 在 c 代码中收集垃圾值,即使在释放后将指针设置为 NULL,代码也不起作用