三、初始化函式
四、上層和頂層之間的轉換函式
基於winpcap和c
首先需要定義資料幀的格式,這裡為了簡便設為:
目的mac(6位元組)+源mac(6位元組)+型別(2位元組)+資料+crc32(4位元組)
為了傳送和接受資料幀,設定兩個結構體,乙個用來傳送資料幀(給底層的),乙個用來儲存資料幀(給上層或使用者的)
還需要設定兩個結構體之間的轉換函式(封裝和解封)
上層按照資料幀的字段設計即可
text就是要傳送的資料,為了節約空間設定成乙個字元指標,在使用時分配空間
設定兩個crc32,乙個用於儲存計算的crc32,乙個用來接收資料幀中的crc32,用來判斷資料在傳輸過程是否發生改變
typedef
struct ether_headerethheader,
*pethheader;
typedef
struct etherether,
*pether;
就是把上層(使用者)的結構體按位元組儲存到乙個字串中,size是總共要傳送的資料位元組大小,data也是在使用中分配,這裡儲存的crc32用於使用者輸出、檢視
傳送的時候呼叫winpcap中的函式傳送
typedef
struct frameframe,
*pframe;
用於使用者設定資料頭
ethheader creat_ethheader
(char
*dhost,
char
*shost,u_int16_t type)
ethhdr.type=type;
return ethhdr;
}
實現crc32計算的**
u_int32_t crc32_table[
256]
;void
generate_crc32_table()
crc32_table[i]
= crc;}}
u_int32_t calculate_crc
(u_int8_t *buffer,
int len)
crc ^
=0xffffffff
;return crc;
}
封裝資料
(上層轉換為下層(兩個函式作用一樣,只是引數不一樣))
要點:要判斷資料字段是否在46和1500位元組之間,還有傳過來字串不要直接使用(可能會越界訪問)
frame*
ether_pack
(pethheader pethheader,
char
*matadata,
int size)
else
if(size>
1500
) pf->size=size+18;
//6+6+2+4=18
pf->data=
(char*)
malloc
(pf->size)
;for
(i=0
;i<
(pf->size)-4
;i++
) u_int32_t crc32=
calculate_crc
(pf->data,
(pf->size)-4
);pf->crc32=crc32;
for(
;isize;i++
)return pf;
}frame*
ether_pack_one
(pether pether)
解封資料(下層到上層)
這裡沒有進行crc32的比較
pether ether_unpack
(pframe pf)
for(
;i<
12;i++
) pe->textsize=pf->size-18;
pe->text=
(char*)
malloc
(pe->textsize)
;for
(;i<
12+pe->textsize;i++
) pe->crc32_recv=0;
for(
;isize;i++
) u_int32_t crc=
calculate_crc
(pf->data,pf->size-4)
; pe->crc32=crc;
return pe;
}
工業乙太網的常見協議
1 modbus tcp ip 該協議由施耐德公司推出,以一種非常簡單的方式將modbus幀嵌入到tcp幀中,使modbus與乙太網和tcp ip結合,成為modbus tcp ip。這是一種面向連線的方式,每乙個呼叫都要求乙個應答,這種呼叫 應答的機制與modbus的主 從機制一致,但通過工業乙太...
一 乙太網協議
乙太網協議 用於10mbps的乙太網,作者以下所說的乙太網均指10m乙太網,而不是100m,1000m的乙太網 乙太網協議有兩種,一種是ieee802.2 ieee802.3,還有一種是乙太網的封裝格式。現代的作業系統均能同時支援這兩種型別的協議格式。因此對我們來說只需要了解其中的一種就夠了,特別是...
TCP IP(一) 乙太網幀協議
乙太網幀說明 乙太網幀大小必須在64 1518位元組 不包含前導碼和定界符 即包括目的位址 6b 源位址 6b 型別 2b 資料 fcs 4b 在內,其中資料段大小在46 1500位元組之間。乙太網幀結構 乙太網由前導碼 7b 定界符 1b 目的位址 6b 源位址 6b 型別 2b 資料 fcs 4...