資源簡介
arpSend.c為arp包發(fā)送事例
arpRecv.c為arp包接受事例
main.c為android平臺的接受arp包分析padding字段后對方發(fā)送udp原始套接字事例
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#define?src_addr?“10.10.3.1“???//需要進行arp解析的ip
#define?device??“eno1“????????????????//本機的哪塊網(wǎng)卡
#define?fill_buf?“windakaSear“
int?socket_id;
char?*target?=?src_addr;
int?send_count?=?0;
int?recv_count?=?0;
struct?in_addr??src?dst;
struct?sockaddr_ll???me?he;
struct?timeval???send_time?recv_time;
struct?in_addr?get_src_ip(char?*?devices)//獲得本機相應(yīng)網(wǎng)卡的ip
{
????struct?sockaddr_in?saddr;
????int?sock_id?=?socket(AF_INET?SOCK_DGRAM?0);//設(shè)置數(shù)據(jù)報socket
????if?(sock_id?0)?{
????????perror(“socket“);
????????exit(2);
????}
????if?(devices)?{
????????if?(setsockopt(sock_id?SOL_SOCKET?SO_BINDTODEVICE?device?strlen(device)?+?1)?==?-1)//將socketbind到網(wǎng)卡上
????????????perror(“WARNING:?interface?is?ignored“);
????}
????int?alen?=?sizeof(saddr);
????memset(&saddr?0?sizeof(saddr));
????saddr.sin_port?=?htons(0x1000);//設(shè)置端口
????saddr.sin_family?=?AF_INET;
????if?(connect(sock_id?(struct?sockaddr*)&saddr?sizeof(saddr))?==?-1)?{//將socket連接到相應(yīng)的inet地址上
????????perror(“connect“);
????????exit(2);
????}
????if?(getsockname(sock_id?(struct?sockaddr*)&saddr?&alen)?==?-1)?{//通過socket獲得綁定的ip地址
????????perror(“getsockname“);
????????exit(2);
????}
????close(sock_id);
????return?saddr.sin_addr;
}
int?check_device(char*?if_dev?int?ss)//網(wǎng)卡和socket????將網(wǎng)卡設(shè)置為混雜模式?
{
????int?ifindex;
????struct?ifreq?ifr;
????memset(&ifr?0?sizeof(ifr));
????strncpy(ifr.ifr_name?if_dev?IFNAMSIZ?-?1);//網(wǎng)卡設(shè)備名
????if?(ioctl(ss?SIOCGIFINDEX?&ifr)?0)?{
????????fprintf(stderr?“arping:?unknown?iface?%s\n“?if_dev);
????????exit(2);
????}
????ifindex?=?ifr.ifr_ifindex;
????if?(ioctl(ss?SIOCGIFFLAGS?(char*)&ifr))?{
????????perror(“ioctl(SIOCGIFFLAGS)“);
????????exit(2);
????}
????if?(!(ifr.ifr_flags&IFF_UP))?{
????????printf(“Interface?\“%s\“?is?down\n“?if_dev);
????????exit(2);
????}
????if?(ifr.ifr_flags&(IFF_NOARP?|?IFF_LOOPBACK))?{
????????printf(“Interface?\“%s\“?is?not?ARPable\n“?if_dev);
????????exit(2);
????}
????return?ifindex;
}?//?check_device()
?
int?socket_init()
{
????int?s?s_errno;
????s?=?socket(PF_PACKET?SOCK_DGRAM?0);//數(shù)據(jù)包
????s_errno?=?errno;
????me.sll_family?=?AF_PACKET;
????me.sll_ifindex?=?check_device(device?s);
????me.sll_protocol?=?htons(ETH_P_ARP);
????if?(bind(s?(struct?sockaddr*)&me?sizeof(me))?==?-1)?{
???????perror(“bind“);
???????exit(2);
????}
????int?alen?=?sizeof(me);
????if?(getsockname(s?(struct?sockaddr*)&me?&alen)?==?-1)?{
????????perror(“getsockname“);
????????exit(2);
????}
????if?(me.sll_halen?==?0)?{
????????printf(“Interface?\“%s\“?is
評論
共有 條評論