1.位元組順序和轉換函式
先來了解乙個概念:大端模式和小端模式 大端模式是指高位元組資料存放在低位址處,低位元組資料存放在高位址處. 小端模式是指低位元組資料放在記憶體的記憶體低位址處,高位元組資料存放在記憶體的高位址處. 在網路上傳輸資料時,由於資料傳輸的兩端可能對應不同的硬體平台,採用的儲存位元組的順序也可能不一致,因此tcp/ip協議規定了在網路上必須採用網路位元組順序(大端模式),對於char 型資料,由於其只佔乙個位元組,所以不存在這個問題,所以一般都把緩衝區定義成char 型,而對於ip位址等非char型的資料, 必須在數劇傳送到網路前將其轉換成大端,在接收資料前 再將其轉換成符合接收端主機的儲存模式. linux 下有4個大小端的轉換函式. #include uint32_t htonl(uint32_t hostlong); uint16_t htons(uint16_t hostshort); uint32_t ntohl(uint32_t netlong); uint16_t ntohs(uint16_t netshort); htonl表示host to network long:用於將主機unsigned int 型資料轉換成網路位元組順序, htons表示host to network short:用於將主機unsigned short型資料轉換為網路位元組順序 ntohl表示network to host long:用於就將網路unsigned int 型資料轉換為主機的位元組順序. ntohs表示network to host short:用於將網路unsigned short 型資料轉換為主機位元組順序.
2. inet系列函式
通常我們習慣用字串形式的網路位址,然而在網路上進行資料通訊時,需要使用的是二進位制形式且為網路位元組順序的ip位址,linux 提供了一系列函式. #include #include #include int inet_aton(const char *cp,struct in_addr *inp); inet_aton()將引數cp所指的字串形式的ip位址轉換為二進位制的網路位元組順序的ip位址,轉換的結果儲存在inp所指向的空間裡.函式執行成功返回非0,失敗返回0; in_addr_r inet_addr(const char*cp); inet_aton()將引數cp所指的字串形式的ip位址轉換為二進位制的網路位元組順序的ip位址.執行成功返回轉換後的結果,引數無效返回inaddr_none,該函式已經過時, in_addr_t inet_network(const char *cp); inet_network()將引數cp所指的字串形式的網路位址轉換為主機位元組順序形式的二進位制ip位址,執行成功返回轉換後的結果,引數無效返回-1; char *inet_ntoa(struct in_addr in); 該函式將把值為in的網路位元組順序形式的二進位制ip位址轉換成以"."分隔的字串形式,執行成功返回結果字串的指標,引數無效返回null; struct in_addr_inet_makeaddr(int net,int host); 該函式把網路號為引數net,主機號為host的兩個位址組合成乙個網路位址,如net取0xac11(172.17.0.0,主機位元組順序),host取0xf283(0.0.242.131,主機位元組順序形式),則組合後的位址172.17.242.131 .並表示為網路位元組順序形式0x83f211ac. int addr_t inet_lnaof(struct in_addr in); 該函式從引數in 中提取出主機位址,執行成功返回主機位元組順序形式的主機位址. in_addr_t inet_netof(str) 該函式從引數in中提取出網路位址,執行成功主機位元組順序形式的網路位址. 看個例子:
#include #include #include #include #include #include int main()結果:else
//示例inet_addr()函式
if((address=inet_addr(buffer))==inaddr_none) //in_addr inet_addr(const char *cp); 成功返回轉換後的結果,失敗返回inaddr_none;
else
//示例inet_network()函式
if((address=inet_network(buffer))==-1) //in_addr inet_network(const char *cp);成功返回轉換的結果,失敗返回 -1;
else
//示例inet_ntoa()函式
if(inet_ntoa(in)==null) //char *inet_ntoa(struct in_addr in);成功返回結果字串的指標,失敗返回null;
else
//示例使用inet_lnaof()與inet_netof()函式
host=inet_lnaof(in);//in_addr inet_lnaof(struct in_addr in)轉換為主機位元組順序的主機位址
network=inet_netof(in); //in_addr inet_netof(struct in_adr in)轉換為主機順序的網路位址
printf("inet_lnaof:\t0x%x\n",host);
printf("inet_netof:\t0x%x\n",network);
in=inet_makeaddr(network,host);// struct in_addr inet_makeaddr(int net,int host);返回結構體;
printf(" inet_makeaddr:0x%x\n",in.s_addr);
return 0;
}
inet_aton: 0x403a8c0
inet_addr: 0x403a8c0
inet_network: 0xc0a80304
inet_ntoa: 192.168.3.4
inet_lnaof: 0x4
inet_netof: 0xc0a803
inet_makeaddr:0x403a8c0
再此執行255.255.255.255
yang@liu:~/syc/第11章$ ./a.out可以看出inet_addr() 和函式inet_network()函式會把255.255.255.255當做無效的位址;inet_aton: 0xffffffff
inet_addr: 無效的ip位址
inet_network: 無效的ip位址
inet_ntoa: 255.255.255.255
inet_lnaof: 0xff
inet_netof: 0xffffff
inet_makeaddr:0xffffffff
系統呼叫 函式呼叫
linux下對檔案操作有兩種方式 提供了庫函式,如open close read write ioctl 等,需包含標頭檔案unistd.h。以write 函式為例 其函式原型為size t write int fd,const void buf,size t nbytes 其操作物件為檔案控制代碼...
系統呼叫與庫函式呼叫
linux下對檔案操作有兩種方式 系統呼叫 system call 和庫函式呼叫 library functions 系統呼叫實際上就是指最底層的乙個呼叫,在linux程式設計裡面就是底層呼叫的意思。面向的是硬體。而庫函式呼叫則面向的是應用開發的,相當於應用程式的api,採用這樣的方式有很多種原因,...
linux系統呼叫函式
acct 禁止 啟用系統記錄程序資訊。若file為null,記錄功能將被禁用 若file指向乙個存在的檔案 以 0 結尾 則記錄功能被啟用,正常結束的程序都會在該檔案尾新增對應的資訊。異常結束是指重啟或其它致命的系統問題。acct 不能生成那些永遠不會結束的程序的資訊。關於acct 使用的記錄結構及...