qq964939641 2013-09-27 08:47 采纳率: 0%
浏览 2146
已结题

libpcap抓包然后用socket raw 发出去

我想实现这样一个功能用pcap抓包在回调函数中用可以处理底层数据的socket套接字发出去。现在发送IP包没问题但是发送MAC包貌似死循环发送了 部分代码如下:
这是我发送数据包的代码
int sockfd_MAC = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 创建Socket
void SendMACPacket(int sockfd, void* msg, size_t len)
{
struct sockaddr_ll addr;
memset( &addr, 0, sizeof(addr) );
addr.sll_family = AF_PACKET;
struct ifreq ifstruct;
strcpy(ifstruct.ifr_name, "eth0");
ioctl(sockfd, SIOCGIFINDEX, &ifstruct); //??I/O??
addr.sll_ifindex = ifstruct.ifr_ifindex;
addr.sll_protocol = htons(ETH_P_ALL);
memcpy(addr.sll_addr,((struct eth_hdr*)msg)->h_source,6);

    sendto(sockfd, msg, len, 0, &addr, sizeof(struct sockaddr_ll));

}

pcap_loop(handle,packetCount,GenPcapPacket,NULL);

回调函数在这
int GenPcapPacket(u_char argument,const struct pcap_pkthdr pack,const u_char *content)
{
const u_char *buf;
buf = content;

    SendMACPacket(sockfd_MAC, (void*)buf, pack->len);

return 0;

}

  • 写回答

1条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-20 19:42
    关注

    该回答引用ChatGPT

    您的代码看起来没有明显的死循环,但是可能存在一些问题。首先,您的回调函数将从pcap_loop()函数中调用,其中pack参数是pcap捕获到的数据包的头部信息,content参数是指向数据包内容的指针。因此,您不需要从content中复制数据,只需要将它作为参数传递给SendMACPacket函数即可。


    另外,在SendMACPacket函数中,您使用了memcpy将源MAC地址复制到addr.sll_addr中。但是,这是不正确的,因为它实际上应该是目的MAC地址,而不是源MAC地址。您需要将addr.sll_addr设置为目的MAC地址。


    最后,在SendMACPacket函数中,您使用了sendto函数来发送数据包。但是,您没有检查sendto的返回值,这可能导致数据包未能成功发送。您应该检查sendto的返回值,并根据需要采取措施。


    下面是一些更新的代码,以解决上述问题:

    int sockfd_MAC = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // 创建Socket
    
    void SendMACPacket(int sockfd, const u_char* packet, size_t len)
    {
        struct sockaddr_ll addr;
        memset(&addr, 0, sizeof(addr));
        addr.sll_family = AF_PACKET;
    
        struct ifreq ifstruct;
        strcpy(ifstruct.ifr_name, "eth0");
        ioctl(sockfd, SIOCGIFINDEX, &ifstruct);
        addr.sll_ifindex = ifstruct.ifr_ifindex;
        addr.sll_protocol = htons(ETH_P_ALL);
    
        memcpy(addr.sll_addr, &packet[0], 6); // 设置目的MAC地址
    
        int ret = sendto(sockfd, packet, len, 0, (struct sockaddr*)&addr, sizeof(addr));
        if (ret == -1) {
            perror("sendto error");
        }
    }
    
    void GenPcapPacket(u_char* argument, const struct pcap_pkthdr* pack, const u_char* content)
    {
        SendMACPacket(sockfd_MAC, content, pack->len);
    }
    
    pcap_loop(handle, packetCount, GenPcapPacket, NULL);
    
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月13日

悬赏问题

  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急