第二十七 二十八天 網路資料封裝及各層資料的傳送

2021-07-13 07:18:24 字數 3567 閱讀 1984

為了對網路五層有更加深入的了解,通過下面的程式對網絡卡的資料進行抓包分析。實現類似與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 #include3

4 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點多就不困了,天氣有點冷,醒了。告訴自己,都是正常的。確實是正常的。都是人最直觀的感受。改變固有思維,以前會聯想很多造成的,讓自己越來越膽小。可這一切都是那麼的正常。固定的生物鐘也改起了。一切放輕鬆。不怪以前的自己,畢竟自己一天比一天好。多學習別人身上的優點,不狹隘。不能因為環境冷了,而埋怨自...