C語言實現ping命令(一)

2022-03-19 08:34:58 字數 1566 閱讀 4936

ping命令使用到了網路中的icmp協議:

關於icmp介紹看這裡:

網路位址資訊

struct

sockaddr_in;

struct

in_addr;

struct

in_addr;

#define in_addr_t uint32_t //

無符號整型32位

還可以使用以下結構體:

struct

sockaddr;

成員sa_data儲存的資訊包含ip位址和埠號,剩餘部分填充0。

在使用時定義資訊位址時使用struct sockaddr_in結構體,然後將該結構體型別轉成struct sockaddr結構體傳遞給網路程式設計。

主機位元組序與網路位元組序

在cpu中,4位元組整型數值1在記憶體空間儲存方式是不同的。

4位元組整型數值1可用二進位制表示如下:

00000000 00000000 00000000 00000001

而在有些cpu則以倒序儲存

00000001 00000000 00000000 00000000

這兩種cpu解析資料的方式分別被稱為

為了使傳送和接受雙方主機的cpu在解析資料方式上保持一致,在網路傳輸資料時約定統一為大端序,這種約定被稱之為網路位元組序。

所以在網路傳輸資料前,需要把資料陣列轉換成大端序格式再進行網路傳輸,接收到網路資料後,需要轉換本機位元組格式然後進行後續處理。該步驟都會有關函式來處理。

我們需要做的就是向struct sockaddr_in結構體變數種填充ip位址和埠資料的時候轉換該格。

具體轉換位元組序的函式有以下幾種方式:

unsigned short htons(unsigned short

);unsigned

short ntohs(unsigned short

);unsigned

long htonl(unsigned long

);unsigned

long ntohl(unsigned long);

htonl/htons中h表示(host)主機位元組序,n表示(network)網路位元組序,s表示short,l指的是long(linux中long型別和int一樣只佔4位元組)。

例項:

/*

test.c

*/#include

#include

intmain()

執行結果:

host order short: 0x1234

network order short: 0x3412

host order long: 0x12345678

network order long: 0x78563412

擴充套件:

intel系統的cpu採用的都是小端序標準。

Go語言實現ping命令

ping是使用icmp協議 icmp協議的組成 type 8bits code 8bits 校驗碼 checksum,8bits id 16bits 序號 sequence,16bits 資料 這些組成部分的含義 1 type icmp的型別,標識生成的錯誤報文 2 code 進一步劃分icmp的型...

linux下ping的C語言實現

include stdio.h include signal.h include arpa inet.h include sys types.h include sys socket.h include unistd.h include netinet in h include netinet ip...

用C語言實現死亡之ping

ping of death ca199260 或 ping o death,國內有的譯作 死亡之png 攻擊利用協議實現時的漏洞cve199028,向受害者傳送超長的ping資料報,導致受害者系統異常。根據tcpp規範rfc791要求,資料報的長度不得超過65535位元組,其中包括至少20位元組的包...