天天看點

Linux下PF_PACKET的使用,RARP的server和client程序

1.介绍

在linux中提供了pf_packet接口可以操作链路层的数据。

2.使用方法

定义一个pf_packet = socket(pf_socket, sock_raw, htons(eth_p_rarp));

就可以利用函数sendto和recefrom来读取和发送链路层的数据包了(当然,发送arp包,上面第三个参数要变为htons(eth_p_arp),或者ip的包为eth_p_ip,可查看文件/usr/include/linux/if_ether.h文件看到所有支持的协议)。

3.在使用sock_raw, sock_dgram和sock_packet的区别

在socket的第一个参数使用pf_packet的时候,上述三种socket的类型都可以使用。但是有区别。

(1)使用sock_raw发送的数据必须包含链路层的协议头,接受得到的数据包,包含链路层协议头。而使用sock_dgram则都不含链路层的协议头。

(2)sock_packet也是可以使用的,但是已经废弃,以后不保证还能支持,不推荐使用。

(3)在使用sock_raw或sock_dgram和sock_packet时,在sendto和recvfrom中使用的地址类型不同,前两者使用sockaddr_ll类型的地址,而后者使用sockaddr类型的地址。

(4)如socket的第一个参数使用pf_inet,第二个参数使用sock_raw,则可以得到原始的ip包。

4.下面的例子是一个简单的rarp协议的server程序和client程序

server程序一开始获得除lo接口以外接口的mac地址,等待rarp request请求的到来,如果请求的是自己的mac地址,则向客户端发送rarp reply,回送自己的ip地址。应我使用的地方,一台机器的ip地址每次dhcp以后都会变。所以该程序还是有一些用处。

注意:本程序只为演示packet socket的工作原理,所以没有进行任何的错误处理,并假设工作的机器上只有ethernet接口。但是本程序有个缺点,就是两个程序工作在同一台机器上的时候,server无法接收到client的rarp request。请知道的朋友赐教,谢谢!

//file name : rarp_server.cpp

转载自:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=686647&id=1745799