Linux網(wǎng)絡(luò)編程(第二版):第8章 服務(wù)器和客戶端信息的_第1頁(yè)
Linux網(wǎng)絡(luò)編程(第二版):第8章 服務(wù)器和客戶端信息的_第2頁(yè)
Linux網(wǎng)絡(luò)編程(第二版):第8章 服務(wù)器和客戶端信息的_第3頁(yè)
Linux網(wǎng)絡(luò)編程(第二版):第8章 服務(wù)器和客戶端信息的_第4頁(yè)
Linux網(wǎng)絡(luò)編程(第二版):第8章 服務(wù)器和客戶端信息的_第5頁(yè)
已閱讀5頁(yè),還剩44頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章服務(wù)器和客戶端信息的獲取8.1字節(jié)序8.2字符串IP地址和二進(jìn)制IP地址的轉(zhuǎn)換8.3套接字描述符判定函數(shù)issockettype()8.4IP地址與域名之間的相互轉(zhuǎn)換8.5協(xié)議名稱處理函數(shù)8.1字節(jié)序8.1.1大端字節(jié)序和小端字節(jié)序8.1.2字節(jié)序轉(zhuǎn)換函數(shù)8.1.3一個(gè)字節(jié)序轉(zhuǎn)換的例子8.1.1大端字節(jié)序和小端字節(jié)序字節(jié)序是由于CPU和OS對(duì)多字節(jié)變量的內(nèi)存存儲(chǔ)順序不同而產(chǎn)生的。1.字節(jié)序介紹2.字節(jié)序的例子1.字節(jié)序介紹大于一個(gè)字節(jié)的變量類型的表示方法有兩種:小端字節(jié)序(LittleEndian,LE):在表示變量的內(nèi)存地址的起始地址存放低字節(jié),高字節(jié)順序存放;大端字節(jié)序(BigEndian,BE):在表示變量的內(nèi)存地址的起始地址存放高字節(jié),低字節(jié)順序存放。2.字節(jié)序的例子(1)字節(jié)序結(jié)構(gòu)。(2)變量聲明。(3)小端字節(jié)序判斷。(4)大端字節(jié)序判斷。(5)編譯運(yùn)行程序。8.1.2字節(jié)序轉(zhuǎn)換函數(shù)網(wǎng)絡(luò)字節(jié)序是指多字節(jié)變量在網(wǎng)絡(luò)傳輸時(shí)的表示方法,網(wǎng)絡(luò)字節(jié)序采用高端字節(jié)序的表示方法。這樣小端字節(jié)序的系統(tǒng)通過(guò)網(wǎng)絡(luò)傳輸變量的時(shí)候需要進(jìn)行字節(jié)序的轉(zhuǎn)換,大端字節(jié)序的變量則不需要進(jìn)行轉(zhuǎn)換。1.字節(jié)序轉(zhuǎn)換函數(shù)介紹2.字節(jié)序轉(zhuǎn)換的方法1.字節(jié)序轉(zhuǎn)換函數(shù)介紹#include<arpa/inet.h>uint32_t

htonl(uint32_thostlong);

/*主機(jī)字節(jié)序到網(wǎng)絡(luò)字節(jié)序的長(zhǎng)整型轉(zhuǎn)換*/uint16_t

htons(uint16_thostshort);

/*主機(jī)字節(jié)序到網(wǎng)絡(luò)字節(jié)序的短整型轉(zhuǎn)換*/uint32_t

ntohl(uint32_tnetlong);

/*網(wǎng)絡(luò)字節(jié)序到主機(jī)字節(jié)序的長(zhǎng)整型轉(zhuǎn)換*/uint16_t

ntohs(uint16_tnetshort);

/*網(wǎng)絡(luò)字節(jié)序到主機(jī)字節(jié)序的短整型轉(zhuǎn)換*/2.字節(jié)序轉(zhuǎn)換的方法8.1.3一個(gè)字節(jié)序轉(zhuǎn)換的例子1.16位字節(jié)序轉(zhuǎn)換結(jié)構(gòu)2.32位字節(jié)序轉(zhuǎn)換結(jié)構(gòu)3.變量值打印函數(shù)showvalue()4.主函數(shù)main()5.16位值0xabcd的二次轉(zhuǎn)換6.32位值0x12345678的二次轉(zhuǎn)換7.結(jié)果打印8.編譯運(yùn)行程序8.2字符串IP地址和二進(jìn)制IP地址的轉(zhuǎn)換8.2.1inet_xxx()函數(shù)8.2.2inet_pton()和inet_ntop()函數(shù)8.2.3使用8.2.1節(jié)地址轉(zhuǎn)換函數(shù)的例子8.2.4使用函數(shù)inet_pton()和函數(shù)inet_ntop()的例子8.2.1inet_xxx()函數(shù)Linux操作系統(tǒng)有一組函數(shù)用于網(wǎng)絡(luò)地址的字符串形式和二進(jìn)制形式之間的轉(zhuǎn)換,其形式為inet_xxx()。1.inet_aton()函數(shù)2.inet_addr()函數(shù)3.inet_network()函數(shù)4.inet_ntoa()函數(shù)5.inet_makeaddr()函數(shù)6.inet_lnaof()函數(shù)7.inet_netof()函數(shù)8.結(jié)構(gòu)structin_addr1.inet_aton()函數(shù)inet_aton()函數(shù)將在cp中存儲(chǔ)的點(diǎn)分十進(jìn)制字符串類型的IP地址,轉(zhuǎn)換為二進(jìn)制的IP地址,轉(zhuǎn)換后的值保存在指針inp指向的結(jié)構(gòu)structurein_addr中。當(dāng)轉(zhuǎn)換成功時(shí)返回值為非0,當(dāng)傳入的地址非法時(shí),返回值為0。2.inet_addr()函數(shù)inet_addr()函數(shù)將cp中存儲(chǔ)的點(diǎn)分十進(jìn)制字符串類型的IP地址轉(zhuǎn)換為二進(jìn)制的IP地址,IP地址是以網(wǎng)絡(luò)字節(jié)序表達(dá)的。如果輸入的參數(shù)非法,返回值為INADDR_NONE(通常為–1),否則返回值為轉(zhuǎn)換后的IP地址。3.inet_network()函數(shù)inet_network()函數(shù)將cp中存儲(chǔ)的點(diǎn)分十進(jìn)制字符串類型的IP地址,轉(zhuǎn)換為二進(jìn)制的IP地址,IP地址是以網(wǎng)絡(luò)字節(jié)序表達(dá)的。當(dāng)成功時(shí)返回32位表示IP地址,失敗時(shí)返回值為–1。4.inet_ntoa()函數(shù)inet_ntoa()函數(shù)將一個(gè)參數(shù)in所表示的Internet地址結(jié)構(gòu)轉(zhuǎn)換為點(diǎn)分十進(jìn)制的4段式字符串IP地址,其形式為a.b.c.d。返回值為轉(zhuǎn)換后的字符串指針,此內(nèi)存區(qū)域?yàn)殪o態(tài)的,有可能會(huì)被覆蓋,因此函數(shù)并不是線程安全的。5.inet_makeaddr()函數(shù)一個(gè)主機(jī)的IP地址分為網(wǎng)絡(luò)地址和主機(jī)地址,inet_makeaddr()函數(shù)將主機(jī)字節(jié)序的網(wǎng)絡(luò)地址net和主機(jī)地址host合并成一個(gè)網(wǎng)絡(luò)字節(jié)序的IP地址。6.inet_lnaof()函數(shù)inet_lnaof()函數(shù)返回IP地址的主機(jī)部分。constchar*addr="";unsignedlongip=

inet_network(addr);unsignedlonghost_id=

inet_lnaof(ip);7.inet_netof()函數(shù)inet_netof()函數(shù)返回IP地址的網(wǎng)絡(luò)部分。constchar*addr="";unsignedlongip=

inet_network(addr);unsignedlongnetwork_id=

inet_netof

(ip);8.結(jié)構(gòu)structin_addr結(jié)構(gòu)structin_addr在文件<netinet/in.h>中定義,結(jié)構(gòu)in_addr有一個(gè)unsignedlongint類型的成員變量s_addr。通常所說(shuō)的IP地址的二進(jìn)制形式就保存在成員變量s_addr中。結(jié)構(gòu)structin_addr的原型如下:structin_addr{unsignedlongints_addr;

/*IP地址*/}8.2.2inet_pton()和inet_ntop()函數(shù)inet_pton()函數(shù)和inet_ntop()函數(shù)是一套安全的協(xié)議無(wú)關(guān)的地址轉(zhuǎn)換函數(shù)。所謂的“安全”是相對(duì)于inet_aton()函數(shù)的不可重入性來(lái)說(shuō)。這兩個(gè)函數(shù)都是可以重入的,并且這些函數(shù)支持多種地址類型,包括IPv4和IPv6。1.inet_pton()函數(shù)2.inet_ntop()函數(shù)1.inet_pton()函數(shù)inet_pton()函數(shù)將字符串類型的IP地址轉(zhuǎn)換為二進(jìn)制類型,其原型如下。第1個(gè)參數(shù)af表示網(wǎng)絡(luò)類型的協(xié)議族,在IPv4下的值為AF_INET;第2個(gè)參數(shù)src表示需要轉(zhuǎn)換的字符串;第3個(gè)參數(shù)dst指向轉(zhuǎn)換后的結(jié)果,在IPv4下,dst指向結(jié)構(gòu)structin_addr的指針。#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>intinet_pton(intaf,constchar*src,void*dst);2.inet_ntop()函數(shù)inet_ntop()函數(shù)將二進(jìn)制的網(wǎng)絡(luò)IP地址轉(zhuǎn)換為字符串#include<sys/types.h>#include<sys/socket.h>#include<arpa/inet.h>constchar*inet_ntop(intaf,constvoid*src,char*dst,socklen_tcnt);8.2.3使用8.2.1節(jié)地址轉(zhuǎn)換函數(shù)的例子下面的代碼是使用8.2.1節(jié)中的函數(shù)進(jìn)行測(cè)試的例子,在這個(gè)例子中對(duì)函數(shù)inet_aton()、inet_addr()、inet_ntoa()、inet_addr()、inet_netof()的使用給出了簡(jiǎn)單的使用方法,并對(duì)函數(shù)的重入性能進(jìn)行了測(cè)試。測(cè)試結(jié)果表明函數(shù)inet_ntoa()、inet_addr()是不可重入的。1.初始化設(shè)置2.測(cè)試函數(shù)inet_aton()3.測(cè)試函數(shù)inet_addr()4.測(cè)試函數(shù)inet_ntoa()5.測(cè)試函數(shù)addr()6.測(cè)試函數(shù)inet_lnaof()7.測(cè)試函數(shù)inet_lnaof()8.編譯運(yùn)行程序1.初始化設(shè)置先對(duì)程序進(jìn)行初始化的必要設(shè)置。例如測(cè)試的字符串IP地址、用戶保存結(jié)果的網(wǎng)絡(luò)地址結(jié)構(gòu)和IP地址結(jié)構(gòu)等參數(shù)。08

structin_addrip,local,network;09

charaddr1[]="";

/*a.b.c.d類型的網(wǎng)絡(luò)地址字符串*/10

charaddr2[]="55";

/*二進(jìn)制值為全1的IP地址對(duì)應(yīng)的字符串*/11

charaddr3[]="192.16.1";

/*a.b.c類型的網(wǎng)絡(luò)地址字符串*/12

char*str=NULL,*str2=NULL;13

14

interr=0;2.測(cè)試函數(shù)inet_aton()測(cè)試函數(shù)inet_aton(),將字符串IP地址轉(zhuǎn)換成二進(jìn)制IP地址,并將結(jié)果打印出來(lái)。15

/*測(cè)試函數(shù)inet_aton*/

16

err=inet_aton(addr1,&ip);3.測(cè)試函數(shù)inet_addr()測(cè)試函數(shù)inet_addr(),將字符串IP地址轉(zhuǎn)換為二進(jìn)制IP地址。先測(cè)試,再測(cè)試55。22

/*inet_addr,先測(cè)試,再測(cè)試55*/

23

ip.s_addr=inet_addr(addr1);4.測(cè)試函數(shù)inet_ntoa()35

/*inet_ntoa,先測(cè)試,再測(cè)試5536 *證明函數(shù)的不可重入性*/38

ip.s_addr=192<<24|168<<16|1<<8|1;39

str=inet_ntoa(ip);40

ip.s_addr=255<<24|255<<16|255<<8|255;41

str2=inet_ntoa(ip);

42

printf("inet_ntoa:ip:0x%xstring1%s,preis:%s\n",ip.s_addr,str2,str);5.測(cè)試函數(shù)addr()測(cè)試函數(shù)inet_addr(),將字符串IP地址轉(zhuǎn)換為二進(jìn)制IP地址,使用的字符串為192.16.1。44

ip.s_addr=inet_addr(addr3);...50

str=inet_ntoa(ip);6.測(cè)試函數(shù)inet_lnaof()測(cè)試函數(shù)inet_lnaof(),獲得本機(jī)地址。這個(gè)函數(shù)只取四段式IP地址的最后一段。55

local.s_addr=inet_lnaof(ip);56

str=inet_ntoa(local);

57

printf("inet_lnaof:string%sip:0x%x\n",str,local.s_addr);7.測(cè)試函數(shù)inet_lnaof()測(cè)試函數(shù)inet_lnaof(),獲得本機(jī)地址。這個(gè)函數(shù)只取四段式IP地址的前三段。01

/*測(cè)試函數(shù)inet_netof,獲得本機(jī)地址*/02

network.s_addr=inet_netof(ip);03

printf("inet_netof:value:0x%x\n",network.s_addr);04

05

return0;06

}8.編譯運(yùn)行程序inet_aton:stringvalueis:0x101a8c0inet_addr:stringvalueis:0x101a8c0inet_addr:string55errorinet_ntoa:ip:0xffffffffstring155,preis:55inet_addr:string192.16.1valueis:0x10010c0inet_ntoa:stringip:0x10010c0inet_lnaof:stringip:0x1inet_netof:value:0xc0a8018.2.4使用函數(shù)inet_pton()和函數(shù)inet_ntop()的例子在代碼中使用函數(shù)inet_pton()將字符串轉(zhuǎn)換為二進(jìn)制,使用函數(shù)inet_ntop()將二進(jìn)制IP地址轉(zhuǎn)化為字符串。16

err=inet_pton(AF_INET,IPSTR,&ip);

/*將字符串轉(zhuǎn)換為二進(jìn)制*/....24

str=(constchar*)inet_ntop(AF_INET,(void*)&ip,(char*)&addr[0],

ADDRLEN);8.3套接字描述符判定函數(shù)issockettype()8.3.1進(jìn)行文件描述符判定的函數(shù)issockettype()8.3.2main()函數(shù)8.3.1進(jìn)行文件描述符判定的函數(shù)issockettype()issockettype()函數(shù)先獲得描述符的狀態(tài),保存在變量st中,將st的成員st_mode與S_IFMT進(jìn)行“與”運(yùn)算后獲取文件描述符的模式。判斷上述值是否與S_IFSOCK相等,可以知道文件描述符是否為套接字文件描述符。8.3.2main()函數(shù)先判斷標(biāo)準(zhǔn)輸入是否為套接字文件描述符,將判斷結(jié)果打印出來(lái)。然后建立一個(gè)套接字s,使用函數(shù)issockttype()對(duì)s進(jìn)行判斷,并將判斷結(jié)果打印出來(lái)。03

intret=issockettype(0);

/*查詢標(biāo)準(zhǔn)輸入是否套接字描述符*/......07

ret=issockettype(s);/*查詢是否為套接字描述*/8.4IP地址與域名之間的相互轉(zhuǎn)換8.4.1DNS原理8.4.2獲取主機(jī)信息的函數(shù)8.4.3使用主機(jī)名獲取主機(jī)信息的例子8.4.4函數(shù)gethostbyname()不可重入的例子8.4.1DNS原理DNS用于TCP/IP的網(wǎng)絡(luò),用比較形象化的友好命名來(lái)代替枯燥的IP地址,方便用戶記憶。DNS的功能就是在主機(jī)的名稱和IP地址之間擔(dān)任翻譯工作。1.DNS查詢過(guò)程2.DNS的拓?fù)浣Y(jié)構(gòu)1.DNS查詢過(guò)程2.DNS的拓?fù)浣Y(jié)構(gòu)DNS按照樹(shù)形的結(jié)構(gòu)構(gòu)造,頂級(jí)域名服務(wù)器下分為多個(gè)二級(jí)域名服務(wù)器,二級(jí)域名服務(wù)器下又分為多個(gè)下級(jí)的域名服務(wù)器,每個(gè)域名服務(wù)器都下轄了一些主機(jī)。8.4.2獲取主機(jī)信息的函數(shù)gethostbyname()函數(shù)和gethostbyaddr()函數(shù)都可以獲得主機(jī)的信息。gethostbyname()函數(shù)通過(guò)主機(jī)的名稱獲得主機(jī)的信息,gethostbyaddr()函數(shù)通過(guò)IP地址獲得主機(jī)的信息。1.gethostbyname()函數(shù)2.gethostbyaddr()函數(shù)1.gethostbyname()函數(shù)gethostbyname()函數(shù)的原型如下,它根據(jù)主機(jī)名獲取主機(jī)的信息,例如,使用gethostbyname("")可以獲得主機(jī)的信息。這個(gè)函數(shù)的參數(shù)name是要查詢的主機(jī)名,通常是DNS的域名。#include<netdb.h>externinth_errno;structhostent*gethostbyname(constchar*name);2.gethostbyaddr()函數(shù)gethostbyaddr()函數(shù)通過(guò)查詢IP地址來(lái)獲得主機(jī)的信息。#include<netdb.h>#include<sys/socket.h>structhostent*

gethostbyaddr(constvoid*addr,intlen,inttype);8.4.3使用主機(jī)名獲取主機(jī)信息的例子下面的例子代碼查詢的信息,并將主機(jī)的信息打印出來(lái)。1.獲得主機(jī)名2.打印主機(jī)相關(guān)信息3.編譯運(yùn)行程序8.4.4函數(shù)gethostbyname()不可重入的例子在8.3.2節(jié)例子的基礎(chǔ)上,修改其代碼,先調(diào)用gethostbyname()函數(shù)獲得的信息,然后調(diào)用gethostbyname()函數(shù)獲得的信息,打印輸出消息。8.5協(xié)議名稱處理函數(shù)8.5.1xxxprotoxxx()函數(shù)8.5.2使用協(xié)議族函數(shù)的例子8.5.1xxxprotoxxx()函數(shù)協(xié)議族處理函數(shù)有如下幾個(gè),可以通過(guò)協(xié)議的名稱、編號(hào)等獲取協(xié)議類型。#include<netdb.h>structprotoent*getprotoent(void);

/*從協(xié)議文件中讀取一行*/structprotoent*getprotobyname(constchar*name);/*從協(xié)議文件中找到匹配項(xiàng)*/structprotoent*getprotobynumber(intproto);

/*按照協(xié)議類型的值獲取匹配項(xiàng)*/voidsetprotoent(intstayopen);

/*設(shè)置協(xié)議

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論