You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用sendto发送二层802.11帧重复发包问题求助

二层Raw套接字发送802.11帧重复发送问题

问题背景

  • 将Alfa Awus适配器通过iwconfig wlanAdapter mode monitor设置为监听模式
  • 编写C语言代码使用PF_PACKET类型的二层Raw套接字发送802.11认证帧,sendto()执行后会触发重复发送数据包

代码实现

#include <stdio.h>
#include <linux/if_packet.h>
#include <net/ethernet.h> 
//更多头文件

void wpaHandshakeStart(){
    
    //初始化数据
    struct sockaddr_ll ll; // => 链路层
    struct ifreq ifreq_i;
    
    int sock_raw = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); // => 套接字为二层


    //网络接口名称
    memset(&ifreq_i,0,sizeof(ifreq_i)); memset(&ll,0,sizeof(ll));
    strncpy(ifreq_i.ifr_name,"wlx00181a0e1066",IFNAMSIZ-1); 
     
    if((ioctl(sock_raw,SIOCGIFINDEX,&ifreq_i))<0)
        printf("indeks ioctl okumasında hata"); //获取索引名称
     
    printf("indeks=%d\n",ifreq_i.ifr_ifindex);

    ll.sll_ifindex = ifreq_i.ifr_ifindex; ll.sll_protocol = htons(ETH_P_ALL); ll.sll_family = PF_PACKET;
    
    //绑定套接字到接口
    if(bind(sock_raw, (struct sockaddr *)&ll, sizeof(ll)) == -1){ printf("Err: bind failed %d\n", errno); }
    
    unsigned char *buffer = (unsigned char *)malloc(65526); //memset(&buffer, '\0', 65511);
    
    
    //初始化完成,发送认证消息并等待...推荐等待11秒
    
    //发送AUTH请求 
    
    int sendlen = sendto(sock_raw, &authFromIphone, sizeof(authFromIphone), 0, 0, 0);
    //int sendlen = sendto(sock_raw, &authFromIphone, sizeof(authFromIphone), 0, (const struct sockaddr*)&ll, sizeof(struct sockaddr_ll));
    if(sendlen < 0) { printf("gönderme hatası....send_len=%d....errno=%d\n", sendlen, errno); return;
    }else{ printf("AUTH request gonderildi, kod: %d\n", sendlen); }
    
}

注:authFromIphone是头文件中声明的char []或unsigned char []数组

现象细节

  • 无论发送什么数据包,都会触发重复发送,第二个包大小比第一个少17字节
  • Wireshark抓包示例:
54  1.884994038 7a:29:b6:e6:48:79   HuaweiTechno_e5:61:19   802.11  84  Authentication, SN=253, FN=0, Flags=........C
55  1.885410147 7a:29:b6:e6:48:79   HuaweiTechno_e5:61:19   802.11  67  Authentication, SN=253, FN=0, Flags=........
  • 进一步分析:第二个重复包由内核触发,内核会删除所有头部和FCS后重发;手动发送的第一个包仅含RX标志,第二个重发包带TX标志且标记为发送失败的包

已尝试操作

  • 更换Kali Linux和Ubuntu系统,问题未解决
  • 修改sendto()最后三个参数为0,无效
  • 已杀死NetworkManager,尚未尝试杀死wpa_supplicant

求助需求

  • 明确内核判定发送失败的依据
  • 获取解决该重复发送问题的方法

内容的提问来源于stack exchange,提问作者C.Unbay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:45:06