第一个问题struct ifreq报错不允许使用不完整的类型

将#include<net/if.h>改为#include<linux/if.h>

不明白具体原因

运行报错:sendto: No such device or address,帮我分析代码有没有问题,代码如下:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <linux/if_ether.h> #include <linux/if_packet.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <net/if.h> #include <net/ethernet.h> #define ETH_IF_NAME "eth0" // 使用的网络接口名称 #define TEST_PACKET_SIZE 64 // 测试包大小 #define TEST_PAYLOAD "PHY Loopback Test" int create_raw_socket(const char *ifname) { int sockfd; struct ifreq ifr; // 创建原始套接字 if ((sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) < 0) { perror("socket"); return -1; } // 获取网络接口索引 memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFINDEX, &ifr) < 0) { perror("ioctl SIOCGIFINDEX"); close(sockfd); return -1; } // 绑定套接字到网络接口 struct sockaddr_ll sll; memset(&sll, 0, sizeof(sll)); sll.sll_family = AF_PACKET; sll.sll_ifindex = ifr.ifr_ifindex; sll.sll_protocol = htons(ETH_P_ALL); if (bind(sockfd, (struct sockaddr *)&sll, sizeof(sll)) < 0) { perror("bind"); close(sockfd); return -1; } return sockfd; } int send_test_packet(int sockfd, const char *ifname) { char buffer[TEST_PACKET_SIZE]; struct ether_header *eth_hdr = (struct ether_header *)buffer; struct sockaddr_ll sll; struct ifreq ifr; // 获取网络接口的MAC地址 memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1); if (ioctl(sockfd, SIOCGIFHWADDR, &ifr) < 0) { perror("ioctl SIOCGIFHWADDR"); return -1; } // 构建以太网帧 memset(buffer, 0, TEST_PACKET_SIZE); memcpy(eth_hdr->ether_dhost, ifr.ifr_hwaddr.sa_data, ETH_ALEN); // 目标MAC地址(回环) memcpy(eth_hdr->ether_shost, ifr.ifr_hwaddr.sa_data, ETH_ALEN); // 源MAC地址 eth_hdr->ether_type = htons(ETH_P_IP); // 以太网类型(IP) // 填充测试数据 memcpy(buffer + sizeof(struct ether
03-27
修改为本地ip后还是无法进行arp扫描,发送了arp请求,这个是我当前的代码: // ARP条目结构 typedef struct arp_entry { struct in_addr ip; // IP地址 struct ether_addr mac; // MAC地址 time_t last_update; // 最后更新时间戳 struct arp_entry *next; // 链表指针 } arp_entry_t; // 扫描器配置 typedef struct arp_scanner { int enabled; // 功能开关 (1=启用, 0=禁用) time_t scan_cycle; // 扫描周期(秒) time_t entry_ttl; // 条目有效期(秒) int packet_interval; // 发包间隔(毫秒) struct in_addr ip_start;// 起始IP struct in_addr ip_end; // 结束IP arp_entry_t *arp_table; // ARP表头指针 pthread_mutex_t lock; // 线程安全锁 } arp_scanner_t; // 构造ARP请求,todo:好像会发出arp请求,得确定一下 void build_arp_request(struct ether_header *ehdr, struct ether_arp *arp_req, struct in_addr local_ip, struct in_addr target_ip, struct ether_addr local_mac) { // 以太网帧头 memset(ehdr->ether_dhost, 0xFF, ETHER_ADDR_LEN); // 广播地址 memcpy(arp_req->arp_sha, &local_mac, ETHER_ADDR_LEN); ehdr->ether_type = htons(ETHERTYPE_ARP); // ARP请求体 arp_req->arp_hrd = htons(ARPHRD_ETHER); // 硬件类型 arp_req->arp_pro = htons(ETHERTYPE_IP); // 协议类型 arp_req->arp_hln = ETHER_ADDR_LEN; // 硬件地址长度 arp_req->arp_pln = sizeof(in_addr_t); // 协议地址长度 arp_req->arp_op = htons(ARPOP_REQUEST); // 操作码=请求 memcpy(arp_req->arp_sha, &local_mac, ETHER_ADDR_LEN); memcpy(arp_req->arp_spa, &local_ip, sizeof(in_addr_t)); // 目标MAC初始为空 memset(arp_req->arp_tha, 0x00, ETHER_ADDR_LEN); // 发送方IP memcpy(arp_req->arp_tpa, &target_ip, sizeof(in_addr_t)); // 目标IP } // 扫描线程函数 void *scan_thread(void *arg) { struct ether_addr local_mac; struct in_addr local_ip; if (get_local_ipmac("ens33", &local_mac, &local_ip) < 0) { // 替换为实际网卡名 perror("获取MAC失败"); return NULL; } // 创建原始套接字 int sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ARP)); if (sockfd < 0) { perror("socket创建失败"); return NULL; } while (scanner.enabled) { struct in_addr current_ip = scanner.ip_start; // 遍历IP范围 while (current_ip.s_addr <= scanner.ip_end.s_addr) { char packet[sizeof(struct ether_header) + sizeof(struct ether_arp)]; struct ether_header *ehdr = (struct ether_header *)packet; struct ether_arp *arp_req = (struct ether_arp *)(packet + sizeof(struct ether_header)); build_arp_request(ehdr, arp_req, local_ip, current_ip, local_mac); // 发送ARP请求 if (sendto(sockfd, packet, sizeof(packet), 0, NULL, 0) < 0) { perror("ARP请求发送失败"); printf("错误详情: %s (代码: %d)\n", strerror(errno), errno); } // IP递增 current_ip.s_addr = htonl(ntohl(current_ip.s_addr) + 1); usleep(scanner.packet_interval * 1000); // 发包间隔 } sleep(scanner.scan_cycle); // 等待扫描周期 } close(sockfd); return NULL; } 报错ARP请求发送失败: No such device or address 错误详情: No such device or address (代码: 6)
08-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值