為了對網路五層有更加深入的了解,通過下面的程式對網絡卡的資料進行抓包分析。實現類似與wireshark的功能。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include in.h>8 #include 9 #include
1011
#pragma pack(1)
12struct
my_arphdr;
23void show_mac(const unsigned char *data);
24void show_ip(const unsigned char *data);
25void show_arp(const unsigned char *data);
26void show_tcp(const unsigned char *data);
27void show_udp(const unsigned char *data);
2829
30int
main()
3137
38int ret = 0;39
int i = 0
;40 unsigned char buff[1024] = ;
41while(1)48
if(ret < 42)//
不處理錯誤包
49continue;50
show_mac(buff);
51 printf("
\n\n\n");
52}5354}55
56void show_mac(const unsigned char *data)
75void show_ip(const unsigned char *data)
94void show_arp(const unsigned char *data)
118void show_udp(const unsigned char *data)
127void show_tcp(const unsigned char *data)
137138 printf("
--------------應用層-----------\n");
139int i = 0
;140
for(i=0;i<20;i++)
141 printf("
%c",*(data+i));
142 printf("\n"
);143 }
對於網路抓包程式的編寫,主要是要熟練掌握幾個協議的首部。了解其中的運作機制。在學習過程中,還對校驗和使用的回滾演算法進行編寫。下面是回滾演算法的實現:
1 #include2 #include34 unsigned short check_sum(unsigned char *data,int
len);
5int
main()6;
13 unsigned short ret = 0
;14 ret = check_sum(data,20
);15 printf("
check sum is %x\n
",htons(ret));
1617
}
18 unsigned short check_sum(unsigned char *data,int
len)
27//
如果是單數的話,加最後乙個
28if
(len)
31//
將位累加和的高位與低位第一次相加
32 retsum = ((retsum >>16) & 0xffff) +(retsum & 0xffff
);33
return ~ret;
34 }
下面的**是對於資料報的封裝,以及傳送網路層資料。
1 #include2 #include3 #include4 #includein.h>5 #include
6#pragma pack(1)
7struct
udphdr;
13struct
iphdr;
26void encapsulation_ip(char *buff,unsigned short
tolen);
27void encapsulation_udp(char *buff,unsigned short
udp_len);
28data_len);
2930
int main(void)31
;34 unsigned short tolen = sizeof(struct iphdr)+sizeof(struct udphdr) +strlen(data);
35 unsigned short udp_len=sizeof(struct udphdr)+strlen(data);
36 unsigned short data_len=sizeof(struct udphdr)+sizeof(struct
iphdr);
3738
encapsulation_ip(buff,tolen);
39 encapsulation_udp(buff+sizeof(struct
iphdr),udp_len);
41int fd =socket(af_inet,sock_raw,ipproto_udp);//建立套接字,使用的是原始資料。
42if(fd < 0)46
struct
sockaddr_in recv;
47 recv.sin_family =af_inet;
48 recv.sin_port = htons(9527
);49 recv.sin_addr.s_addr = inet_addr("
192.168.1.10");
5051
int ret = 0;52
int value = 1;53
int len = 4
;54 ret = setsockopt(fd,ipproto_ip,ip_hdrincl,&value,len);//設定套機字,從網路層傳送資料,如果value為0,則從傳輸層傳送資料。
55if (ret < 0
)59 ret = sendto(fd,buff,tolen,0,(struct sockaddr*)&recv,sizeof(struct
sockaddr));//傳送資料給接收端
60if (ret < 0)64
}656667
void encapsulation_ip( char *buff,unsigned short
tolen)
82void encapsulation_udp(char *buff,unsigned short
udp_len)
8990
data_len)
9899 }
第二十八天
1 建立乙個名稱為itcast的資料庫。create database itcast 2 設計資料表tb student的字段結構,欄位有id 學號 name 姓名 age 年齡 enrolmentdate 入學時間 並選擇適合的資料型別。tb student資料表的字段結構如下表所示 欄位名 型別...
蛻變,第二十八天
1 什麼是包 包是模組的一種形式,包的本質就是乙個含有 init py檔案的資料夾 2.為什麼要有包 因為如果我們要把我們寫的一大堆功能分類處理,並且數量眾多,我們需要進行分檔案儲存,則需要用到包的概念 3 如何用包 匯入包就是在包下的 init py import from import 注意的問...
冥想第二十八天
今天5點多就不困了,天氣有點冷,醒了。告訴自己,都是正常的。確實是正常的。都是人最直觀的感受。改變固有思維,以前會聯想很多造成的,讓自己越來越膽小。可這一切都是那麼的正常。固定的生物鐘也改起了。一切放輕鬆。不怪以前的自己,畢竟自己一天比一天好。多學習別人身上的優點,不狹隘。不能因為環境冷了,而埋怨自...