嵌入式網(wǎng)絡(luò)編程_第1頁(yè)
嵌入式網(wǎng)絡(luò)編程_第2頁(yè)
嵌入式網(wǎng)絡(luò)編程_第3頁(yè)
嵌入式網(wǎng)絡(luò)編程_第4頁(yè)
嵌入式網(wǎng)絡(luò)編程_第5頁(yè)
已閱讀5頁(yè),還剩22頁(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)介

1、嵌入式網(wǎng)絡(luò)編程第1頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1 字節(jié)序字節(jié)序是由于不同的主處理器和操作系統(tǒng)對(duì)大于一個(gè)字節(jié)的變量在內(nèi)存中的存放順序不同而產(chǎn)生的,例如兩個(gè)字節(jié)的short int和四個(gè)字節(jié)的int類型變量都有字節(jié)序的問題。字節(jié)序通常有大端字節(jié)序和小端字節(jié)序的兩種分類方法。第2頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1.1 大端字節(jié)序和小端字節(jié)序字節(jié)序是由于CPU和OS對(duì)多字節(jié)變量的內(nèi)存存儲(chǔ)順序不同而產(chǎn)生的。1字節(jié)序介紹2字節(jié)序的例子第3頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1.2 字節(jié)序轉(zhuǎn)換函數(shù)由于主機(jī)的千差萬(wàn)別,主機(jī)的字

2、節(jié)序不能做到統(tǒng)一,但是對(duì)于網(wǎng)絡(luò)上傳輸?shù)淖兞?,它們的值必須有一個(gè)統(tǒng)一的表示方法。網(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)換的方法第4頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1.2 字節(jié)序轉(zhuǎn)換函數(shù)第5頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1.2 字節(jié)序轉(zhuǎn)換函數(shù)第6頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.1.3 一個(gè)字節(jié)序轉(zhuǎn)換的例子下面的例子是對(duì)16位數(shù)值和32位數(shù)值進(jìn)

3、行字節(jié)序轉(zhuǎn)換,每種類型的數(shù)值進(jìn)行兩次轉(zhuǎn)換,最后打印結(jié)果。116位字節(jié)序轉(zhuǎn)換結(jié)構(gòu)232位字節(jié)序轉(zhuǎn)換結(jié)構(gòu)3變量值打印函數(shù)showvalue4主函數(shù)main516位值0 xabcd的二次轉(zhuǎn)換632位值0 x12345678的二次轉(zhuǎn)換7結(jié)果打印8編譯運(yùn)行程序第7頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.2 字符串IP地址和二進(jìn)制IP地址的轉(zhuǎn)換人們可以理解的IP地址表達(dá)方式是類似“127.0.0.1”這樣的字符串;而計(jì)算機(jī)理解的則是像()這樣表達(dá)的IP地址方式。在網(wǎng)絡(luò)程序的設(shè)計(jì)中,經(jīng)常需要進(jìn)行字符串表達(dá)方式的IP地址和二進(jìn)制的IP地址之間的轉(zhuǎn)換,本節(jié)對(duì)此類函數(shù)進(jìn)行介紹。第8頁(yè),共27頁(yè)

4、,2022年,5月20日,3點(diǎn)12分,星期三8.2.1 inet_xxx()函數(shù)Linux操作系統(tǒng)有一組函數(shù)用于網(wǎng)絡(luò)地址的字符串形式和二進(jìn)制形式之間的轉(zhuǎn)換,其形式為inet_xxx()。函數(shù)的原型如下:#include #include #include 1函數(shù)inet_aton()2函數(shù)inet_addr()3函數(shù)inet_network()4函數(shù)inet_ntoa()5函數(shù)inet_makeaddr()6函數(shù)inet_lnaof()7函數(shù)inet_netof()8結(jié)構(gòu)struct in_addr第9頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.2.2 inet_pton()和

5、inet_ntop()函數(shù)函數(shù)inet_pton()和函數(shù)inet_ntop()是一套安全的協(xié)議無(wú)關(guān)的地址轉(zhuǎn)換函數(shù)。所謂的“安全”是相對(duì)于inet_aton()函數(shù)的不可重入性來(lái)說(shuō)。這兩個(gè)函數(shù)都是可以重入的,并且這些函數(shù)支持多種地址類型,包括IPv4和IPv6。1函數(shù)inet_pton()2函數(shù)inet_ntop()第10頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.2.3 使用小節(jié)地址轉(zhuǎn)換函數(shù)的例子前面的兩個(gè)小節(jié)對(duì)地址轉(zhuǎn)換函數(shù)進(jìn)行了介紹,本節(jié)通過(guò)兩個(gè)例子對(duì)上述函數(shù)進(jìn)行簡(jiǎn)單的說(shuō)明。測(cè)試結(jié)果表明函數(shù)inet_ntoa()、inet_addr()是不可重入的。1初始化設(shè)置2測(cè)試函數(shù)i

6、net_aton()3測(cè)試函數(shù)inet_addr()4測(cè)試函數(shù)inet_ntoa()5測(cè)試函數(shù)inet_ntoa()6測(cè)試函數(shù)inet_lnaof()7測(cè)試函數(shù)inet_lnaof()8編譯運(yùn)行程序第11頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.2.4 使用函數(shù)inet_pton和函數(shù)inet_ntop的例子下面的代碼是使用函數(shù)inet_pton和函數(shù)inet_ntop的例子。在代碼中對(duì)如何使用這兩個(gè)函數(shù)使用函數(shù)inet_pton將字符串轉(zhuǎn)換為二進(jìn)制和使用函數(shù)inet_ntop將二進(jìn)制IP地址轉(zhuǎn)化為字符串的簡(jiǎn)單實(shí)例。#include #include #include #in

7、clude #include #define ADDRLEN 16int main(int argc, char *argv)struct in_addr ip;char IPSTR=192.168.1.1;char addrADDRLEN;const char*str=NULL;int err = 0;err = inet_pton(AF_INET, IPSTR, &ip);if(err 0)printf(inet_pton:ip,%s value is:0 x%xn,IPSTR,ip.s_addr);ip.s_addr = htonl(19224|16816|128|255);/*192.

8、168.12.255*/str = (const char*)inet_ntop(AF_INET, (void*)&ip, (char*)&addr0, ADDRLEN);if(str)printf(inet_ntop:ip,0 x%x is %sn,ip.s_addr,str);return 0;第12頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.3 套接字描述符判定函數(shù)issockettype()套接字文件描述符從形式上與通用文件描述符沒有區(qū)別,判斷一個(gè)文件描述符是否是一個(gè)套接字描述符可以通過(guò)如下的方法實(shí)現(xiàn):先調(diào)用函數(shù)fstat獲得文件描述符的模式,然后將模式的S_IFMT部

9、分與標(biāo)識(shí)符S_IFSOCK比較可以知道一個(gè)文件描述符是否為套接字描述符。下面是套接字描述符判定的實(shí)例代碼。程序代碼先構(gòu)建一個(gè)用于測(cè)試是否為套接字文件描述符的寒暑issockettype(),在主函數(shù)中對(duì)標(biāo)準(zhǔn)輸入和構(gòu)建后的套接字文件描述符進(jìn)行是否套接字文件描述符的判斷。第13頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.3.1 進(jìn)行文件描述符判定的函數(shù)issockettype()這個(gè)函數(shù)先獲得描述符的狀態(tài),保存在變量st中,將st的成員st_mode與S_IFMT進(jìn)行“與”運(yùn)算后獲取文件描述符的模式。判斷上述值是否與S_IFSOCK相等,可以知道文件描述符是否為套接字文件描述符。i

10、nt issockettype(int fd)struct stat st;int err =fstat(fd, &st);if( err 0 )return -1;if(st.st_mode & S_IFMT) = S_IFSOCK)return 1;elsereturn 0;第14頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.3.2 main()函數(shù)先判斷標(biāo)準(zhǔn)輸入是否為套接字文件描述符,將判斷結(jié)果打印出來(lái)。然后建立一個(gè)套接字s,使用函數(shù)issocktype對(duì)s進(jìn)行判斷,并將判斷結(jié)果打印出來(lái)。int main(void)int ret = issockettype(0);pri

11、ntf(value %dn,ret);int s = socket(AF_INET, SOCK_STREAM,0);ret = issockettype(s);printf(value %dn,ret);return 0;第15頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4 IP地址與域名之間的相互轉(zhuǎn)換在實(shí)際的使用中,經(jīng)常有只知道主機(jī)的域名而不知道主機(jī)名對(duì)應(yīng)的IP地址的情況,而socket的API均為基于IP地址,所以如何進(jìn)行主機(jī)域名和IP地址之間的轉(zhuǎn)換是十分必要的。本節(jié)對(duì)DNS的原理和相關(guān)的域名轉(zhuǎn)換函數(shù)進(jìn)行介紹。第16頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8

12、.4.1 DNS原理DNS(Domain Name System)是“域名系統(tǒng)”的英文縮寫,域名系統(tǒng)是一種樹形結(jié)構(gòu),按照區(qū)域組成層次性的結(jié)構(gòu),表示計(jì)算機(jī)名稱和IP地址的對(duì)應(yīng)情況。DNS用于TCP/IP的網(wǎng)絡(luò),用比較形象化的友好命名來(lái)代替枯燥的IP地址,方便用戶記憶。DNS的功能就是在主機(jī)的名稱和IP地址之間擔(dān)任翻譯的作用。1DNS查詢過(guò)程2DNS的拓?fù)浣Y(jié)構(gòu)第17頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4.1 DNS原理第18頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4.2 獲取主機(jī)信息的函數(shù)函數(shù)gethostbyname()和gethostbyaddr()

13、都可以獲得主機(jī)的信息。函數(shù)gethostbyname()通過(guò)主機(jī)的名稱獲得主機(jī)的信息,函數(shù)gethostbyaddr()通過(guò)IP地址獲得主機(jī)的信息。1函數(shù)gethostbyname()2函數(shù)gethostbyaddr()第19頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4.2 獲取主機(jī)信息的函數(shù)第20頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4.3 使用主機(jī)名獲取主機(jī)信息的例子下面的例子代碼查詢的信息,并將主機(jī)的信息打印出來(lái)。1獲得主機(jī)名2打印主機(jī)相關(guān)信息3編譯運(yùn)行程序第21頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.4.4 函數(shù)gethost

14、byname()不可重入的例子在小節(jié)例子的基礎(chǔ)上,修改其代碼,先調(diào)用gethostbyname()函數(shù)獲得的信息,然后調(diào)用gethostbyname()函數(shù)獲得的信息,打印輸出消息。第22頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.5 協(xié)議名稱處理函數(shù)為了方便操作,Linux提供了一組用于查詢協(xié)議的值及名稱的函數(shù)。本節(jié)對(duì)相關(guān)的函數(shù)及使用方法和注意事項(xiàng)進(jìn)行簡(jiǎn)單的介紹。第23頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.5.1 函數(shù)xxxprotoxxx()協(xié)議族處理函數(shù)有如下幾個(gè),可以通過(guò)協(xié)議的名稱、編號(hào)等獲取協(xié)議類型。#include struct protoen

15、t *getprotoent(void);/*從協(xié)議文件中讀取一行*/struct protoent *getprotobyname(const char *name);/*從協(xié)議文件中找到匹配項(xiàng)*/struct protoent *getprotobynumber(int proto);/*按照協(xié)議類型的值獲取匹配項(xiàng)*/void setprotoent(int stayopen);/*設(shè)置協(xié)議文件打開狀態(tài)*/void endprotoent(void);/*關(guān)閉協(xié)議文件*/第24頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.5.1 函數(shù)xxxprotoxxx()第25頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.5.2 使用協(xié)議族函數(shù)的例子如下的例子按照名稱查詢一組協(xié)議的項(xiàng)目,首先用setprotoent(1)打開文件/etc/protocols,然后使用函數(shù)getprotobyname()查詢函數(shù)并顯示出來(lái),最后使用函數(shù)endprotoent()關(guān)閉文件/etc/protocols。代碼如下。1顯示顯示協(xié)議項(xiàng)目函數(shù)display_protocol()2主函數(shù)main()第26頁(yè),共27頁(yè),2022年,5月20日,3點(diǎn)12分,星期三8.6 小結(jié)本章中介紹

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論