资源简介
arp(地址解析协议)实例示范, 含发送和接收,在linux下跑通,带makefile,可用来学习理解arp协议
代码片段和文件信息
// arp.cpp : 定义控制台应用程序的入口点。
//
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include /* 需要里面的 glibc 版本号 */
#include
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include
#include /* 链路层(L2)协议 */
#else
#include
#include
#include /* 链路层协议 */
#endif
#include
/**
以太网的头部结构:
struct ether_header
{
u_int8_t ether_dhost[ETH_ALEN]; // destination eth addr
u_int8_t ether_shost[ETH_ALEN]; // source ether addr
u_int16_t ether_type; // packet type ID field
} __attribute__ ((__packed__));
整个以太网的头部包括: 目的地址(6字节),源地址(6字节),类型(2字节),帧内数据(46-1500个字节),CRC校验和(4字节)
#define ETH_ALEN 6 //以太网地址的长度
#define ETH_HALEN 14 //以太网头部的总长度 (6+6+2)
#define ETH_ZLEN 60 //不含CRC校验数据的数据最小长度(46+14)
#define ETH_DATA_LEN 1500 //帧内数据的最大长度
#define ETH_frame_LEN 1514//不含CRC最大以太网长度(1500+14)
ARP头部信息:
struct arphdr{
__be16 ar_hrd;//硬件类型 1-硬件接口为以太网接口
__be16 ar_pro;//协议类型-0x0800高层协议为IP协议
unsigned char ar_hln;//硬件地址长度-6字节 MAC
unsigned char ar_pln;//协议地址长度-4字节为IP
__be16 ar_op;//ARP操作码-1 ARP请求
}
ARP协议数据结构:
struct ether_arp{
struct arphdr ea_hdr; //ARPfixed-size header(ARP固定大小的报头)
u_char arp_sha[ETHER_ADDR_LEN]; //sender hardware address(发送端硬件地址)
u_char arp_spa[4]; //sender protocol address(发送端协议地址)
u_char arp_tha[ETHER_ADDR_LEN]; // target hardware address(接收端硬件地址)
u_char arp_tpa[4]; //target protocol address(接收端协议地址)
};
#define arp_hrd ea_hdr.ar_hrd
#define arp_pro ea_hdr.ar_pro
#define arp_hln ea_hdr.ar_hln
#define arp_pln ea_hdr.ar_pln
#define arp_op ea_hdr.ar_op
sockaddr_ll为设备无关的物理层地址结构,描述发送端的地址结构
struct sockaddr_ll
{
unsigned short sll_family; 总填 AF_PACKET
unsigned short sll_protocol; 网络序列的物理层协议号 0x806为ARP协议
int sll_ifindex; 接口编号 eth0对应的编号
unsigned short sll_hatype; 头部类型 ARPHRD_ETHER为以太网
unsigned char sll_pkttype; 包类型 PACKET_HOST
unsigned char sll_halen; 地址长度 MAC地址长度6字节
unsigned char sll_addr[8];物理地址 MAC地址只用了前面的6字节
};
FF:FF:FF:FF:FF:FF
SOCK_RAW原始套接字的分析:
(1)socket(AF_INETSOCK_RAWIPPROTO_TCP|IPPROTO_UDP|IPPROTO_ICMP);//发送或接收ip数据包得到原始的IP包
(2)socket(PF_PACKETSOCK_RAWhtons(ETH_P_IP|ETH_P_ARP|ETH_P_RAP|ETH_P_ALL));//发送或接收以太网数据帧
(1)使用第一种套接字类型,能得到发往本机的原始的IP数据包,但不能得到发往非本机的IP数据包,被过滤了,也不能得到从本机发出去的数据包。这类协议可自己组织TCP,ICMP,UDP数据包。
(2)第二种套接字能收到发往本地的MAC帧,也能收到从本机发出去的数据帧(第3个参数为ETH_P_ALL)能接收到非发往本地的MAC数据帧(网卡需要设置为promisc混杂模式)
协议类型:
ETH_P_IP 0X800 只接收发往本机的mac的ip类型的数据帧
ETH_P_ARP 0X806 只接收发往本机的arp类型的数据帧
ETH_P_RARP 0x8035 只接受发往本机的rarp类型的数据帧
ETH_P_ALL 0X3 接收发往本机的MAC所有类型iparprarp数据帧,接收从本机发出去的数据帧,混杂模式打开的情况下,会接收到非发往本地的MAC数据帧
此时设备无关的物理地址使用struct sockaddr_ll
从而得到MAC帧
**/
//发送ARP数据,ARP协议结构+以太网头部
int main(int argc char*argv[]
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1159 2015-01-15 22:27 ReadMe.txt
目录 0 2017-02-16 15:39 arp-recv\
文件 2275 2015-01-18 11:17 arp-recv\arp_recv.cpp
文件 906 2015-01-18 11:28 arp-recv\Makefile
目录 0 2017-02-16 15:39 arp-send\
文件 3069 2015-01-20 21:11 arp-send\arp_send.cpp
文件 906 2015-01-15 23:44 arp-send\Makefile
文件 15092 2015-01-15 23:18 arp
文件 8309 2015-01-15 23:18 arp.cpp
文件 871 2015-01-15 22:27 arp.sln
文件 4111 2015-01-20 23:58 arp.vcproj
文件 11071 2015-01-16 00:11 arp_send
相关资源
- linux二进制分析随书完整源码
- Linux个人防火墙的设计与实现
- DE2-115上以RGMII模式发送ARP测试包Veri
- Socket5服务器源代码
- 基于linux的电子钢琴
- Linux网络设备分析
- linux下为SD卡烧写uboot.bin的原理与方法
- linux音频播放和停止
- WebSocket测试工具
- 利用多线程和Socket实现猜拳游戏.zip
- Linux下使用Qt+V4L2测试UVC相机
- linux设备驱动程序开发 第四版 源码
- dnw_ubuntu
-
fr
amebuffer显示图片 - DM9008 linux 驱动
- linux c select简单
- Lua中调用C函数
- Linux mpu6050驱动程序
- linux 配置文件读写C
- SkinSharp静态库的破解版
- linux0.11内核源码
- 基于UDP SOCKET 统计丢包率
- Socket 同步通信 系列教程——1
- linux进程监控和守护进程的程序
- _Socket_服务端向指定的客户端发送消息
- rocky凝思操作系统ISO镜像刻录到U盘里
- linux按键测试,获取按键状态
- 基于Socket网络聊天系统的设计与实现
- Linux基本命令操作实验报告
- TCP转串口socket转SerialPort
评论
共有 条评论