今天我們說說“Pre-網絡編程”。內容比較雜,但都是在做網絡應用程序開發過程中經常要遇到的問題。
一、大端、小端和網絡字節序
小端字節序:little-endian,將低字節存放在內存的起始地址;
大端字節序:big-endian,將高字節存放在內存的其實地址。
例如,數字index=0x11223344,在大小端字節序方式下其存儲形式為:
上圖一目了然的可以看出大小端字節序的區別。
還有另外一個概念就是網絡字節序。網絡字節順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋。網絡字節順序采用big endian方式。注意:X86系列CPU都是小端little-endian字節序,即低字節存低位,高字節存高位。
為此,Linux專門提供了字節轉換函數.
unsigned long int htonl(unsigned long int hostlong)
unsigned short int htons(unisgned short int hostshort)
unsigned long int ntohl(unsigned long int netlong)
unsigned short int ntohs(unsigned short int netshort)
在這四個轉換函數中,h代表host,n代表 network,s代表short,l代表long 。htonl()函數的意義是將本機器上的long數據轉化為網絡上的long。其他幾個函數的意義也差不多。
看個例子:
也就是說對於從網絡上接收到的非單子節的基本數據類型數據,首先需要用ntohl(s)將其轉換成本地字節序;同理,發往網絡的非單子節的基本數據類型數據,首先用htonl(s)將其轉換成網絡字節序。這裡最常見的就是IP地址和端口號。