編寫網路程式

2021-07-03 13:00:10 字數 1331 閱讀 4393

為什麼需要htons(), ntohl(), ntohs(),htons() 函式

2009-12-11 13:15:51

分類:

在c/c++寫網路程式的時候,往往會遇到位元組的網路順序和主機順序的問題。這是就可能用到htons(), ntohl(), ntohs(),htons()這4個函式。

網路位元組順序與本地位元組順序之間的轉換函式:

htonl()--"host to network long"

ntohl()--"network to host long"

htons()--"host to network short"

ntohs()--"network to host short"

之所以需要這些函式是因為計算機資料表示存在兩種位元組順序:nbo與hbo

網路位元組順序nbo(network byte order):按從高到低的順序儲存,在網路上使用統一的網路位元組順序,可以避免相容性問題。

主機位元組順序(hbo,host byte order):

不同的機器hbo不相同,與cpu設計有關,資料的順序是由cpu決定的,而與作業系統無關。

如 intelx86結構下,short型數0x1234表示為34 12, int型數0x12345678表示為78 56 34 12如ibm power pc結構下,short型數0x1234表示為12 34, int型數0x12345678表示為12   34 56 78

由於這個原因不同體系結構的機器之間無法通訊,所以要轉換成一種約定的數序,也就是網路位元組順序,其實就是如同powerpc那樣的順序 。在pc開發中有ntohl和htonl函式可以用來進行網路位元組和主機位元組的轉換。   

2.在linux和windows網路程式設計時需要用到htons和htonl函式,用來將主機位元組順序轉換為網路位元組順序。

在intel機器下,執行以下程式

main(

)...

得到的結果是4096,初一看感覺很怪。

解釋如下,數字16的16進製表示為0x0010,數字4096的16進製表示為0x1000。由於intel機器是小尾端,儲存數字16時實際順序為1000,儲存4096時實際順序為0010。因此在傳送網路包時為了報文中資料為0010,需要經過htons進行位元組轉換。如果用ibm等大尾端機器,則沒有這種位元組順序轉換,但為了程式的可移植性,也最好用這個函式。

另外用注意,數字所佔位數小於或等於乙個位元組(8 bits)時,不要用htons轉換。這是因為對於主機來說,大小尾端的最小單位為位元組(byte)。

包含的標頭檔案為:"winsock2.h"

socket UDP網路程式編寫

基於udp 面向無連線 的socket程式設計 伺服器 接收端 程式 1.建立套接字 socket 2.將套接字繫結到乙個本地位址和埠上 bind 3.等待接收資料 recvfrom 4.關閉套接字 客戶端 傳送端 程式 1.建立套接字 socket 2.向伺服器端傳送資料 sendto 3.關閉套...

Linux網路驅動程式編寫 二 4

linux網路驅動程式編寫 二 4 2001 06 15 bordi 飲水思源站12 3 4 5 2.2.6 硬體幀頭 hard header 硬體一般都會在上層資料傳送之前加上自己的硬體幀頭,比如乙太網 ether 就有14位元組的幀頭。這個幀頭是加在上層ip ipx等資料報的前 面的。驅動程式提...

Delphi編寫網路程式的安全措施

delphi編寫網路程式的安全措施 delphi的midas控制項為編寫網路程式提供了十分方便的手段。利用這些控制項,可以編寫區域網上的客戶機 伺服器體系程式,也能方便地在internet上建立分散處理的應用。網路程式的乙個重要問題是安全性考慮。一些敏感資料在網上傳送,很有可能被人非法攔截以造成不必...