菜鸟求助 linux下ARP请求发送和接收的问题

xiaoCXYG xiaoCXYG 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
各位大牛,在下最近研究LINUX SOCKET方面的东西,遇到一个问题实在不解,向大家请教

虚拟机下,以bridged adapter方式连接网络

自己写了个ARP请求发送的程序,功能很简单,只是向目的IP发送一个ARP广播包,运行时发现了一些问题,操作步骤如下:
1.发送前查看了本机的MAC映射表
2.运行程序发送后再次查看却没有发现请求的主机的IP和MAC映射
3.通过sniffer观察,发现确实发出了ARP请求包,也确实收到了回应
4.通过自己写的syn_flood对目标主机发送数据包后再次查看映射表,这时出现了目标主机的IP和MAC映射
5.用arp -d删除该映射条目
6.再次运行程序发送ARP请求包,发现这次居然出现了映射条目
7.反复重复第5步和第6步,发现每次均能获得映射条目
8.重启虚拟机,发现第2步中表现出的问题仍然存在

在下表示非常费解,希望能有大牛指导

在线等

源码如下: #include <stdio.h>

#include <error.h>

#include <unistd.h>

#include <string.h>

#include <stdlib.h>

#include <sys/ioctl.h>

#include <sys/socket.h>

#include <linux/if_arp.h>

#include <net/ethernet.h>

#include <linux/if.h>

#include <arpa/inet.h>

#include <linux/if_packet.h>



#define bzero(a, b) memset(a, 0, b)



typedef struct arp_hdr

{

unsigned short ar_hrd; /* format of hardware address */

unsigned short ar_pro; /* format of protocol address */

unsigned char ar_hln; /* length of hardware address */

unsigned char ar_pln; /* length of protocol address */

unsigned short ar_op; /* ARP opcode (command) */



unsigned char ar_sha[ETH_ALEN]; /* sender hardware address */

unsigned char ar_sip[4]; /* sender IP address */

unsigned char ar_tha[ETH_ALEN]; /* target hardware address */

unsigned char ar_tip[4]; /* target IP address */

} arpheader;



static const char *dev_name = "eth4";

const unsigned char brod_mac[ETHER_ADDR_LEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};

const unsigned char SMAC[ETHER_ADDR_LEN] = {0x08, 0x00, 0x27, 0x53, 0x86, 0x1A};

char *sip = "192.168.0.13";

char dip[INET_ADDRSTRLEN];

char sendbuf[64];



int sock;

struct sockaddr_ll sdev, ddev;

struct ether_header eth;

arpheader arph;





void bind_dev(void);

void fill_arphdr(void);



int main(int argc, char *argv[])

{

if(argc < 2)

{

printf("usage :mf <dest IP>\n");

exit(1);

}

//创建套接字

if((sock = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0)

{

perror("socket");

exit(1);

}



bzero(dip, INET_ADDRSTRLEN);

memcpy(dip, argv[1], INET_ADDRSTRLEN);

//绑定设备接口

bind_dev();

//填充ARP报文

fill_arphdr();

//发送ARP请求

if(sendto(sock, sendbuf, 64, 0, (struct sockaddr *)&ddev, sizeof(ddev)) == -1)

{

perror("send to");

exit(1);

}





return 0;

}



void bind_dev(void)

{

struct ifreq dev_itf;

strncpy(dev_itf.ifr_name, dev_name, IFNAMSIZ);



if(ioctl(sock, SIOCGIFINDEX, &dev_itf) == -1)

{

perror("ioctl - get device index");

exit(1);

}



sdev.sll_family = AF_PACKET;

sdev.sll_protocol = htons(ETH_P_ARP);

sdev.sll_ifindex = dev_itf.ifr_ifindex;

sdev.sll_hatype = ARPHRD_ETHER;

sdev.sll_pkttype = PACKET_HOST;

sdev.sll_halen = ETH_ALEN;

memcpy(sdev.sll_addr, SMAC, ETH_ALEN);



ddev.sll_family = AF_PACKET;

ddev.sll_protocol = htons(ETH_P_ARP);

ddev.sll_ifindex = dev_itf.ifr_ifindex;

ddev.sll_hatype = ARPHRD_ETHER;

ddev.sll_pkttype = PACKET_BROADCAST;

ddev.sll_halen = ETH_ALEN;

memcpy(ddev.sll_addr, brod_mac, ETH_ALEN);



if(bind(sock,(struct sockaddr *)&sdev, sizeof(sdev)) < 0)

{

perror("bind");

close(sock);

exit(1);

}

}



void fill_arphdr(void)

{

memcpy(eth.ether_shost, SMAC, ETHER_ADDR_LEN);

memcpy(eth.ether_dhost, brod_mac, ETHER_ADDR_LEN);

eth.ether_type = htons(ETHERTYPE_ARP);



arph.ar_hrd = htons(ARPHRD_ETHER);

arph.ar_pro = htons(ETHERTYPE_IP);

arph.ar_hln = 6;

arph.ar_pln = 4;

arph.ar_op = htons(ARPOP_REQUEST);

memcpy(arph.ar_sha, SMAC, ETH_ALEN);

*((unsigned int *)arph.ar_sip) = inet_addr(sip);

*((unsigned int *)arph.ar_tip) = inet_addr(dip);



bzero(sendbuf, 64);



memcpy(sendbuf, ð, sizeof(struct ether_header));

memcpy(sendbuf + sizeof(struct ether_header), &arph, sizeof(arpheader));

}

...全文

相关推荐

菜鸟宝典-计算机基础知识电子书

从大菜鸟变成高手的经典之作! 从硬件的基本构成,到操作系统,TCP/IP网络协议,编程语言等等,以及入侵网站的原理方法介绍。 chm格式的。

mxw04

菜鸟的N多个命令字符

菜鸟的N多个命令字符

q2390169544

破解wep最简单教程

通过BT3破解无线网络密码.支持USB网卡.

wuliang518

基于恒阻抗负荷模型与母线三相短路扰动条件下三机九节点系统多频段电力系统稳定器暂态稳定性能评估(Simulink仿真实现)

内容概要:本文系统阐述了一套基于优先级规划与Petri网融合的多机器人路径规划(MAPF)MATLAB代码库,该框架将求解过程划分为几何解析、拓扑构建、调度优化与可视化呈现四个层次,实现了从地图解析、四邻域拓扑与Petri网建模,到基于优先级启发式的路径搜索、时间同步与冲突消解,再到动画与视频输出的完整闭环。其核心创新在于采用Petri网将“多机器人无冲突”这一动态时间约束转化为“每库所至多一标记”的静态容量约束,从而支持整数规划求解;并通过动态边权膨胀机制避免因硬封锁导致的虚假不可解问题,结合节点预留历史与几何惩罚驱动的局部同步策略,显著提升了冲突查询效率与调度性能。框架还支持双坐标系统与全流程可视化,便于算法行为分析与结果验证。; 适合人群:具备一定编程基础和机器人路径规划基础知识的研究生、科研人员及工程技术人员,尤其适合从事仓储物流、自动驾驶、无人机编队等多智能体系统研究的专业人士。; 使用场景及目标:① 在大规模多机器人系统中快速生成无冲突路径,适用于自动化仓库调度等工业场景;② 作为教学与研究工具,深入理解MAPF中的优先级规划、Petri网建模、冲突消解机制及其数学本质;③ 支持算法复现与扩展,可用于对比不同启发式策略、同步算法与规划框架的性能差异。; 阅读建议:建议读者按照文中组织结构顺序阅读,重点关注各模块之间的接口设计与信息传递机制,结合提供的代码实例进行调试与运行,深入理解动态边权膨胀、Petri网容量约束转化、节点预留历史与几何惩罚驱动同步等关键技术的设计意图与实现细节。

欢多天天写代码

机械三维3D设计图-打铁扣自动机.zip

机械三维3D设计图-打铁扣自动机.zip

ZL4120505
评论 3
收藏 已收藏
分享
返回顶部
xiaoCXYG
C语言 70,039 成员 243,237 内容