ping命令使用到了網路中的icmp協議:
關於icmp介紹看這裡:
網路位址資訊
structsockaddr_in;
struct
in_addr;
struct
in_addr;
#define in_addr_t uint32_t //
無符號整型32位
還可以使用以下結構體:
structsockaddr;
成員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位元組的包...