1. 程式人生 > >socket地址API

socket地址API

unknown 通過 表示 所有 c語言 sign code java虛擬機 端口

socket 1.主機字節序和網絡字節序 背景:現代CPU的累加器一次都能裝載(至少)4字節(32位機器)。這4字節在**內存中排列的順序**將影響到它被累加器裝載成整數的值。 小知識:字節序分為大端字節序和小端字節序。 1.1big endian:一個整數的高位字節(23-31bit)存儲在內存的低地址處,低位字節(0-7bit)存儲在內存的高地址處。 1.2little endian:整數的高位字節存儲在內存的高地址處,而低位字節儲存在內存的低地址處 代碼如下: void byteorder(){ union{ short value; char union_bytes [sizeof( short )]; } test; test.value = 0x0102; if( (test.union_bytes[0] == 1)&&(test.union_bytes[1] == 2)){ printf("big endian"); }else if( (test.union_bytes[0] == 2)&&(test.union_bytes[1] == 1)){ printf("ittle "); }else{ printf("unknown");} } 1.3現代PC大多采用小段字節序,所以小端字節序又稱為主機字節序。 2.當格式化的數據(32bit or 16bit)在兩臺不同字節序的主機之間傳遞就會出現問題 2.1解決方案:發送端總是把要發送的數據轉化為大端字節序在發送,接收端知道數據總是大端字節序,所以接收端可以根據自身的情況來決定是否轉換(小段轉換,大端字節序不轉換) 3.大端字節序又被稱為網絡字節序 4.進程字節問題:同一臺機器上的兩個進程,一個是C語言,一個是JAVA語言編寫,也要考慮字節序的問題(JAVA虛擬機普遍使用大端字節序) 5.linux轉換大小端字節序的函數(4個) 5.1 unsigned long int htonl(unsigned long int hostlong); 5.2 unsigned short int htons(unsigned short int hostshort); 5.3 unsigned long int ntohl(unsigned long int netlong); 5.4 unsigned short int ntohs(unsigned short int netshort); 5.5上述四個含義比較明確:htonl表示host to network long 即將長整數型(32bit)的主機字節序轉換為網絡字節序數據。 5.6長整型函數通常用來轉換IP地址,短整型常用來轉換端口號(不限於此,所有的格式化的數據通過網絡傳輸時,都應該使用這些函數來轉換字節序)

socket地址API