版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1
6.1TCP/IP概述6.2網(wǎng)絡(luò)基礎(chǔ)編程6.3網(wǎng)絡(luò)高級編程第6章嵌入式Linux網(wǎng)絡(luò)編程2
第6章嵌入式Linux網(wǎng)絡(luò)編程
本章將介紹嵌入式Linux網(wǎng)絡(luò)編程的基礎(chǔ)知識。由于網(wǎng)絡(luò)在嵌入式應(yīng)用系統(tǒng)中的應(yīng)用非常廣泛,基本上常見的應(yīng)用都會與網(wǎng)絡(luò)有關(guān),因此,掌握這一部分的內(nèi)容是非常重要的。經(jīng)過本章的學(xué)習(xí),讀者將會掌握TCP/IP協(xié)議的基礎(chǔ)知識、嵌入式Linux網(wǎng)絡(luò)編程方法、能夠獨立編寫客戶端、服務(wù)器端的通信程序。3
第6章嵌入式Linux網(wǎng)絡(luò)編程6.1TCP/IP概述了解:計算機網(wǎng)絡(luò)的基本概念,熟悉TCP/IP分層模型,理解在網(wǎng)絡(luò)編程中如何選擇TCP/UDP協(xié)議。6.2網(wǎng)絡(luò)基礎(chǔ)編程——本章重點 掌握:1個概念、2個結(jié)構(gòu)、2類函數(shù)、1個流程4
6.1.1TCP/IP的分層模型OSI協(xié)議參考模型,它是基于國際標(biāo)準(zhǔn)化組織(ISO)的建議發(fā)展起來的,它分為7個層次:應(yīng)用層、表示層、會話層、傳輸層、網(wǎng)絡(luò)層、數(shù)據(jù)鏈路層及物理層。這個7層的協(xié)議模型雖然規(guī)定得非常細致和完善,但在實際中卻得不到廣泛的應(yīng)用,其重要的原因之一就在于它過于復(fù)雜。但它仍是此后很多協(xié)議模型的基礎(chǔ)。與此相區(qū)別的TCP/IP協(xié)議模型將OSI的7層協(xié)議模型簡化為4層,從而更有利于實現(xiàn)和使用。6.1TCP/IP概述5
6.1.1TCP/IP的分層模型TCP/IP的協(xié)議參考模型和OSI協(xié)議參考模型的對應(yīng)關(guān)系如下圖:6.1TCP/IP概述6
6.1.1TCP/IP的分層模型TCP/IP的協(xié)議參考模型通訊示意圖6.1TCP/IP概述7
6.1.1TCP/IP的分層模型網(wǎng)絡(luò)接口層(NetworkInterfaceLayer) 網(wǎng)絡(luò)接口層是TCP/IP協(xié)議軟件的最底層,負責(zé)將二進制流轉(zhuǎn)換為數(shù)據(jù)幀,并進行數(shù)據(jù)幀的發(fā)送和接收。數(shù)據(jù)幀是網(wǎng)絡(luò)傳輸?shù)幕締卧?.1TCP/IP概述8
6.1.1TCP/IP的分層模型網(wǎng)絡(luò)層(InternetLayer)
網(wǎng)絡(luò)層負責(zé)在主機之間的通信中選擇數(shù)據(jù)包的傳輸路徑,即路由。當(dāng)網(wǎng)絡(luò)層接收到傳輸層的請求后,傳輸某個具有目的地址信息的分組。該層把分組封裝在IP數(shù)據(jù)包中,填入數(shù)據(jù)包的首部,使用路由算法來確定是直接交付數(shù)據(jù)包,還是把它傳遞給路由器,然后把數(shù)據(jù)包交給適當(dāng)?shù)木W(wǎng)絡(luò)接口進行傳輸。 網(wǎng)絡(luò)層還要負責(zé)處理傳入的數(shù)據(jù)包,檢驗其有效性,使用路由算法來決定應(yīng)該對數(shù)據(jù)包進行本地處理還是應(yīng)該轉(zhuǎn)發(fā)。 如果數(shù)據(jù)包的目的機處于本機所在的網(wǎng)絡(luò),該層軟件就會除去數(shù)據(jù)包的首部,再選擇適當(dāng)?shù)膫鬏攲訁f(xié)議來處理這個分組。6.1TCP/IP概述9
6.1.1TCP/IP的分層模型傳輸層(TransportLayer)
傳輸層負責(zé)提供應(yīng)用程序之間的通信服務(wù)。這種通信又稱為端到端通信。傳輸層要系統(tǒng)地管理信息的流動,還要提供可靠的傳輸服務(wù),以確保數(shù)據(jù)到達無差錯、無亂序。為了達到這個目的,傳輸層協(xié)議軟件要進行協(xié)商,讓接收方回送確認信息及讓發(fā)送方重發(fā)丟失的分組。傳輸層協(xié)議軟件把要傳輸?shù)臄?shù)據(jù)流劃分為分組,把每個分組連同目的地址交給網(wǎng)絡(luò)層去發(fā)送。6.1TCP/IP概述10
6.1.1TCP/IP的分層模型應(yīng)用層(ApplicationLayer)
應(yīng)用層是分層模型的最高層,在這個最高層中,用戶調(diào)用應(yīng)用程序通過TCP/IP互聯(lián)網(wǎng)來訪問可行的服務(wù)。與各個傳輸層協(xié)議交互的應(yīng)用程序負責(zé)接收和發(fā)送數(shù)據(jù)。每個應(yīng)用程序選擇適當(dāng)?shù)膫鬏敺?wù)類型,把數(shù)據(jù)按照傳輸層的格式要求封裝好向下層傳輸。6.1TCP/IP概述11
6.1.2TCP/IP的分層模型特點TCP/IP模型邊界特性TCP/IP分層模型中有兩大邊界特性:一個是地址邊界特性,它將IP邏輯地址與底層網(wǎng)絡(luò)的硬件地址分開;一個是操作系統(tǒng)邊界特性,它將網(wǎng)絡(luò)應(yīng)用與協(xié)議軟件分開。6.1TCP/IP概述12
6.1.2TCP/IP的分層模型特點IP層特性IP層作為通信子網(wǎng)的最高層,提供無連接的數(shù)據(jù)包傳輸機制,但IP協(xié)議并不能保證IP包傳遞的可靠性,IP的機制是點到點的。用IP進行通信的主機或路由器位于同一物理網(wǎng)絡(luò),對等機器之間擁有直接的物理連接。TCP/IP設(shè)計原則之一是為包容各種物理網(wǎng)絡(luò)技術(shù),包容性主要體現(xiàn)在IP層中。各種物理網(wǎng)絡(luò)技術(shù)在幀或報文格式、地址格式等方面差別很大,TCP/IP的重要思想之一就是通過IP將各種底層網(wǎng)絡(luò)技術(shù)統(tǒng)一起來,達到屏蔽底層細節(jié),提供統(tǒng)一虛擬網(wǎng)的目的。6.1TCP/IP概述13
6.1.2TCP/IP的分層模型特點TCP/IP的可靠性特性在TCP/IP網(wǎng)絡(luò)中,IP采用無連接的數(shù)據(jù)報機制,對數(shù)據(jù)進行“盡力而為”的傳遞機制,即只管將報文盡力傳送到目的主機,無論傳輸正確與否,不做驗證,不發(fā)確認,也不保證報文的順序。TCP/IP的可靠性體現(xiàn)在傳輸層協(xié)議之一的TCP協(xié)議。TCP協(xié)議提供面向連接的服務(wù),因為傳輸層是端到端的,所以TCP/IP的可靠性被稱為端到端可靠性。6.1TCP/IP概述14
6.1.2TCP/IP的分層模型特點TCP/IP的特點就是將不同的底層物理網(wǎng)絡(luò)、拓撲結(jié)構(gòu)隱藏起來,向用戶和應(yīng)用程序提供通用、統(tǒng)一的網(wǎng)絡(luò)服務(wù)。這樣,從用戶的角度看,整個TCP/IP互聯(lián)網(wǎng)就是一個統(tǒng)一的整體,它獨立于具體的各種物理網(wǎng)絡(luò)技術(shù),能夠向用戶提供一個通用的網(wǎng)絡(luò)服務(wù)。6.1TCP/IP概述15
6.1.2TCP/IP核心協(xié)議在TCP/IP協(xié)議族中,有很多種協(xié)議。6.1TCP/IP概述16
6.1.2TCP/IP核心協(xié)議TCPTCP的上一層是應(yīng)用層,TCP向應(yīng)用層提供可靠的面向連接的數(shù)據(jù)流傳輸服務(wù),TCP數(shù)據(jù)傳輸實現(xiàn)了從一個應(yīng)用程序到另一個應(yīng)用程序的數(shù)據(jù)傳遞。它能提供高可靠性通信(即數(shù)據(jù)無誤、數(shù)據(jù)無丟失、數(shù)據(jù)無失序、數(shù)據(jù)無重復(fù)到達的通信。),應(yīng)用程序通過向TCP層提交數(shù)據(jù)接發(fā)送/收端的地址和端口號而實現(xiàn)應(yīng)用層的數(shù)據(jù)通信。通過IP的源/目的可以惟一地區(qū)分網(wǎng)絡(luò)中兩個設(shè)備的連接,通過socket的源/目的可以惟一地區(qū)分網(wǎng)絡(luò)中兩個應(yīng)用程序的連接。6.1TCP/IP概述17
6.1.2TCP/IP核心協(xié)議建立連接——三次握手TCP是面向連接的,所謂面向連接,就是當(dāng)計算機雙方通信時必需先建立連接,然后進行數(shù)據(jù)通信,最后拆除連接三個過程。TCP在建立連接時又分三步:6.1TCP/IP概述18
6.1.2TCP/IP核心協(xié)議數(shù)據(jù)傳輸——滑窗協(xié)議:當(dāng)發(fā)送方傳送一個數(shù)據(jù)包時,啟動計時器。當(dāng)該數(shù)據(jù)包到達目的地后,接收方回送一個數(shù)據(jù)包,其中包含一個確認序號,意思是希望收到的下一個數(shù)據(jù)包的順序號。如果發(fā)送方的定時器在確認信息到達之前超時,那么發(fā)送方會重發(fā)該數(shù)據(jù)包。6.1TCP/IP概述19
6.1.2TCP/IP核心協(xié)議TCP數(shù)據(jù)包頭TCP數(shù)據(jù)包頭格式:6.1TCP/IP概述20
6.1.2TCP/IP核心協(xié)議UDPUDP即用戶數(shù)據(jù)報協(xié)議,是一種面向無連接的不可靠傳輸協(xié)議,不需要通過3次握手來建立一個連接,同時,一個UDP應(yīng)用可同時作為應(yīng)用的客戶或服務(wù)器方。由于UDP協(xié)議并不需要建立一個明確的連接,因此建立UDP應(yīng)用要比建立TCP應(yīng)用簡單得多。UDP比TCP協(xié)議更為高效,也能更好地解決實時性的問題,如今,包括網(wǎng)絡(luò)視頻會議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都使用UDP協(xié)議。6.1TCP/IP概述21
6.1.2TCP/IP核心協(xié)議UDP數(shù)據(jù)包頭6.1TCP/IP概述22
6.1.2TCP/IP核心協(xié)議▲協(xié)議選擇協(xié)議的選擇應(yīng)該考慮到數(shù)據(jù)可靠性需求、應(yīng)用的實時性和網(wǎng)絡(luò)的可靠性。對數(shù)據(jù)可靠性要求高的應(yīng)用需選擇TCP協(xié)議,而對數(shù)據(jù)的可靠性要求不那么高的應(yīng)用可選擇UDP傳送。TCP協(xié)議中的3次握手、重傳確認等手段可以保證數(shù)據(jù)傳輸?shù)目煽啃?,但使用TCP協(xié)議會有較大的時延,因此不適合對實時性要求較高的應(yīng)用;而UDP協(xié)議則有很好的實時性。網(wǎng)絡(luò)狀況不是很好的情況下需選用TCP協(xié)議(如在廣域網(wǎng)等情況),網(wǎng)絡(luò)狀況很好的情況下選擇UDP協(xié)議可以減少網(wǎng)絡(luò)負荷。6.1TCP/IP概述23
6.2.1套接字(socket)概述套接字定義在Linux中的網(wǎng)絡(luò)編程是通過socket接口來進行的。套接字(socket)是一種特殊的I/O接口,它也是一種文件描述符.
每一個socket都用一個半相關(guān)描述{協(xié)議、本地地址、本地端口}來表示;一個完整的套接字則用一個相關(guān)描述{協(xié)議、本地地址、本地端口、遠程地址、遠程端口}來表示。socket也有一個類似于打開文件的函數(shù)調(diào)用,該函數(shù)返回一個整型的socket描述符,隨后的連接建立、數(shù)據(jù)傳輸?shù)炔僮鞫际峭ㄟ^socket來實現(xiàn)的。6.2網(wǎng)絡(luò)基礎(chǔ)編程24
6.2.1套接字(socket)概述套接字類型流式套接字(SOCK_STREAM) 流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數(shù)據(jù)傳輸?shù)目煽啃院晚樞蛐?。?shù)據(jù)報套接字(SOCK_DGRAM) 數(shù)據(jù)報套接字定義了一種無連接的服務(wù),數(shù)據(jù)通過相互獨立的報文進行傳輸,是無序的,并且不保證是可靠、無差錯的。它使用數(shù)據(jù)報協(xié)議UDP。原始套接字(SOCK_RAW) 原始套接字允許對底層協(xié)議如IP或ICMP進行直接訪問,它功能強大但使用較為不便,主要用于一些協(xié)議的開發(fā)。6.2網(wǎng)絡(luò)基礎(chǔ)編程25
6.2.2地址及數(shù)據(jù)存儲順序處理地址結(jié)構(gòu)處理structsockaddr{ unsignedshortsa_family;/*地址族*/ charsa_data[14];/*14字節(jié)的協(xié)議地址,包含該socket的IP地址和端口號。*/};6.2網(wǎng)絡(luò)基礎(chǔ)編程26
6.2.2地址及數(shù)據(jù)存儲順序處理地址結(jié)構(gòu)處理structsockaddr_in{ shortintsa_family;/*地址族*/ unsignedshortintsin_port;/*端口號*/
structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持與struct sockaddr同樣大小*/};這兩個數(shù)據(jù)類型是等效的,可以相互轉(zhuǎn)化,通常sockaddr_in數(shù)據(jù)類型使用更為方便。在建立socketadd或sockaddr_in后,就可以對該socket進行適當(dāng)?shù)牟僮髁恕?.2網(wǎng)絡(luò)基礎(chǔ)編程27
6.2.2地址及數(shù)據(jù)存儲順序處理地址結(jié)構(gòu)處理typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;};6.2網(wǎng)絡(luò)基礎(chǔ)編程28
6.2.2地址及數(shù)據(jù)存儲順序處理sa_family字段可選的常見值:6.2網(wǎng)絡(luò)基礎(chǔ)編程29
6.2.2地址及數(shù)據(jù)存儲順序處理數(shù)據(jù)存儲優(yōu)先順序計算機數(shù)據(jù)存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先(稱為大端模式)和低位字節(jié)優(yōu)先(稱為小端模式,PC機通常采用小端模式)。Internet上數(shù)據(jù)以高位字節(jié)優(yōu)先順序在網(wǎng)絡(luò)上傳輸,因此在有些情況下,需要對這兩個字節(jié)存儲優(yōu)先順序進行相互轉(zhuǎn)化。htonl()
4字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序ntohl()
4字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序htons()
2字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序ntohs()
2字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序6.2網(wǎng)絡(luò)基礎(chǔ)編程30
6.2.2地址及數(shù)據(jù)存儲順序處理數(shù)據(jù)存儲優(yōu)先順序6.2網(wǎng)絡(luò)基礎(chǔ)編程31
6.2.2地址及數(shù)據(jù)存儲順序處理地址格式轉(zhuǎn)化用戶在表達地址時通常采用點分十進制表示的數(shù)值字符串(或者是以冒號分開的十進制IPv6地址),而在通常使用的socket編程中所使用的則是二進制值,這就需要將這兩個數(shù)值進行轉(zhuǎn)換。這里在IPv4中用到的函數(shù)有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數(shù)有inet_pton()和inet_ntop()。inet_pton()函數(shù)是將點分十進制地址字符串轉(zhuǎn)換為二進制地址而inet_ntop()是inet_pton()的反向操作,將二進制地址轉(zhuǎn)換為點分十進制地址字符串。6.2網(wǎng)絡(luò)基礎(chǔ)編程32
6.2.2地址及數(shù)據(jù)存儲順序處理inet_pton()函數(shù)格式:6.2網(wǎng)絡(luò)基礎(chǔ)編程33
6.2.2地址及數(shù)據(jù)存儲順序處理inet_ntop()函數(shù)格式:6.2網(wǎng)絡(luò)基礎(chǔ)編程34
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換(了解)通常,人們在使用過程中都不愿意記憶冗長的IP地址,尤其到IPv6時,地址長度多達128位,那時就更加不可能一次次記憶那么長的IP地址了。因此,使用主機名將會是很好的選擇。在Linux中,同樣有一些函數(shù)可以實現(xiàn)主機名和地址的轉(zhuǎn)化,最為常見的有g(shù)ethostbyname、gethostbyaddr、getaddrinfo等,它們都可以實現(xiàn)IPv4和IPv6的地址和主機名之間的轉(zhuǎn)化。其中g(shù)ethostbyname是將主機名轉(zhuǎn)化為IP地址,gethostbyaddr則是逆操作,是將IP地址轉(zhuǎn)化為主機名,另外getaddrinfo還能實現(xiàn)自動識別IPv4地址和IPv6地址。6.2網(wǎng)絡(luò)基礎(chǔ)編程35
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換gethostbyname()和gethostbyaddr()都涉及到一個hostent的結(jié)構(gòu)體structhostent{ char*h_name; /*正式主機名*/ char**h_aliases; /*主機別名*/ inth_addrtype; /*地址類型*/ inth_length; /*地址字節(jié)長度*/ char**h_addr_list; /*指向IPv4或IPv6的地址指針數(shù)組*/}6.2網(wǎng)絡(luò)基礎(chǔ)編程36
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換getaddrinfo()函數(shù)涉及到一個addrinfo的結(jié)構(gòu)體structaddrinfo{ intai_flags; /*AI_PASSIVE,AI_CANONNAME;*/ intai_family; /*地址族*/ intai_socktype; /*socket類型*/ intai_protocol; /*協(xié)議類型*/ size_tai_addrlen; /*地址字節(jié)長度*/ char*ai_canonname; /*主機名*/ structsockaddr*ai_addr; /*socketaddr結(jié)構(gòu)體*/ structaddrinfo*ai_next; /*下一個指針鏈表*/}6.2網(wǎng)絡(luò)基礎(chǔ)編程37
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換gethostbyname()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程38
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換getaddrinfo()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程39
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換addrinfo常見選項:6.2網(wǎng)絡(luò)基礎(chǔ)編程40
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換addrinfo常見選項:6.2網(wǎng)絡(luò)基礎(chǔ)編程41
6.2.2地址及數(shù)據(jù)存儲順序處理名字地址轉(zhuǎn)換注意:
通常服務(wù)器端在調(diào)用getaddrinfo()之前,ai_flags設(shè)置AI_PASSIVE,用于bind()函數(shù)(用于端口和地址的綁定,后面會講到),主機名nodename通常會設(shè)置為NULL??蛻舳苏{(diào)用getaddrinfo()時,ai_flags一般不設(shè)置AI_PASSIVE,但是主機名nodename和服務(wù)名servname(端口)則應(yīng)該不為空。getaddrinfo()使用示例6.2網(wǎng)絡(luò)基礎(chǔ)編程42
6.2.3套接字編程進行socket編程的基本函數(shù)有socket、bind、listen、accept、send、sendto、recv、recvfrom這幾個,其中對于客戶端和服務(wù)器端以及TCP和UDP的操作流程都有所區(qū)別,這里先對每個函數(shù)進行一定的說明,再給出不同情況下使用的流程圖。6.2網(wǎng)絡(luò)基礎(chǔ)編程43
6.2.3套接字編程6.2網(wǎng)絡(luò)基礎(chǔ)編程socket:該函數(shù)用于建立一個套接字,一條通信路線的端點。在建立了socket之后,可對sockadd或sockaddr_in進行初始化,以保存所建立的socket信息。socket()實際上指定了相關(guān)五元組中的協(xié)議這一元:SOCKETsocket(intaddr_family,intsocktype,intprotocol)bind:該函數(shù)用于綁定本地IP地址和端口號,若綁定其他地址則不能成功。它主要用于TCP的連接,而在UDP的連接中則無必要。intbind(SOCKETs,conststructsockaddr*name,intnamelen)44
6.2.3套接字編程6.2網(wǎng)絡(luò)基礎(chǔ)編程listen:該函數(shù)在TCP中用于服務(wù)器端,表明它愿意接收連接intlisten(SOCKETs,intbacklog)backlog為允許的請求連接隊列長度。accept():
在TCP中用于服務(wù)器端,用于等待從SOCKETs上接受客戶連接請求(addr,addrlen為發(fā)送請求的客戶方信息):SOCKETaccept(SOCKETs,structsockaddr*addr,int*addrlen)45
6.2.3套接字編程6.2網(wǎng)絡(luò)基礎(chǔ)編程connect:該函數(shù)在TCP中用于bind的之后的client端,用于與服務(wù)器端建立連接,而在UDP中由于沒有了bind函數(shù),因此用connect有點類似bind函數(shù)的作用。intconnect(SOCKETs,conststructsockaddrname,intnamelen)send和recv:這兩個函數(shù)用于接收和發(fā)送數(shù)據(jù),可以用在TCP中,也可以用在UDP中。當(dāng)用在UDP時,可以在connect函數(shù)建立連接之后再用。intsend(SOCKETs,constchar*buf,intlen,intflags)intrev(SOCKETs,char*buf,intlen,intflags)46
6.2.3套接字編程6.2網(wǎng)絡(luò)基礎(chǔ)編程sendto和recvfrom:這兩個函數(shù)的作用與send和recv函數(shù)類似,也可以用在TCP和UDP中。當(dāng)用在TCP時,后面的幾個與地址有關(guān)參數(shù)不起作用,函數(shù)作用等同于send和recv;當(dāng)用在UDP時,可以用在之前沒有使用connect的情況時,這兩個函數(shù)可以自動尋找指定地址并進行連接。47
6.2.3套接字編程使用TCP時Socket編程6.2網(wǎng)絡(luò)基礎(chǔ)編程48
6.2.3套接字編程使用UDP時Socket編程6.2網(wǎng)絡(luò)基礎(chǔ)編程49
6.2.3套接字編程socket()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程50
6.2.3套接字編程bind()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程51
6.2.3套接字編程listen()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程52
6.2.3套接字編程accept()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程53
6.2.3套接字編程connect()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程54
6.2.3套接字編程send()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程55
6.2.3套接字編程recv()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程56
6.2.3套接字編程sendto()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程57
6.2.3套接字編程recvfrom()函數(shù)語法:6.2網(wǎng)絡(luò)基礎(chǔ)編程58
6.2.3套接字編程示例:分為服務(wù)器端和客戶端兩部分服務(wù)器端——先建立socket→與本地端口進行綁定→接收客戶端的連接請求并建立與它的連接→接收客戶端發(fā)送的消息并顯示→退出??蛻舳恕ocket→與本地端口綁定→向服務(wù)器發(fā)送連接請求→向服務(wù)器發(fā)送消息→退出。6.2網(wǎng)絡(luò)基礎(chǔ)編程server.cclient.c59
第6章嵌入式Linux網(wǎng)絡(luò)編程6.2網(wǎng)絡(luò)基礎(chǔ)編程——重點 掌握:1個概念、2個結(jié)構(gòu)、2類函數(shù)、1個流程60
兩個結(jié)構(gòu)地址結(jié)構(gòu)處理structsockaddr{ unsignedshortsa_family;/*地址族*/ charsa_data[14];/*14字節(jié)的協(xié)議地址,包含該socket的IP地址和端口號。*/};6.2網(wǎng)絡(luò)基礎(chǔ)編程61
6.2.2地址及數(shù)據(jù)存儲順序處理地址結(jié)構(gòu)處理structsockaddr_in{ shortintsa_family;/*地址族*/ unsignedshortintsin_port;/*端口號*/
structin_addrsin_addr;/*IP地址*/ unsignedcharsin_zero[8];/*填充0以保持與struct sockaddr同樣大小*/};這兩個數(shù)據(jù)類型是等效的,可以相互轉(zhuǎn)化,通常sockaddr_in數(shù)據(jù)類型使用更為方便。在建立socketadd或sockaddr_in后,就可以對該socket進行適當(dāng)?shù)牟僮髁恕?.2網(wǎng)絡(luò)基礎(chǔ)編程62
6.2.2地址及數(shù)據(jù)存儲順序處理地址結(jié)構(gòu)處理typedefuint32_tin_addr_t;structin_addr{in_addr_ts_addr;};6.2網(wǎng)絡(luò)基礎(chǔ)編程63
兩類函數(shù)數(shù)據(jù)存儲優(yōu)先順序htonl()
4字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序ntohl()
4字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序htons()
2字節(jié)主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序ntohs()
2字節(jié)網(wǎng)絡(luò)字節(jié)序轉(zhuǎn)換為主機字節(jié)序6.2網(wǎng)絡(luò)基礎(chǔ)編程64
兩類函數(shù)地址格式轉(zhuǎn)化用戶在表達地址時通常采用點分十進制表示的數(shù)值字符串(或者是以冒號分開的十進制IPv6地址),而在通常使用的socket編程中所使用的則是二進制值,這就需要將這兩個數(shù)值進行轉(zhuǎn)換。這里在IPv4中用到的函數(shù)有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數(shù)有inet_pton()和inet_ntop()。inet_pton()函數(shù)是將點分十進制地址字符串轉(zhuǎn)換為二進制地址而inet_ntop()是inet_pton()的反向操作,將二進制地址轉(zhuǎn)換為點分十進制地址字符串。6.2網(wǎng)絡(luò)基礎(chǔ)編程65
inet_pton()函數(shù)格式:6.2網(wǎng)絡(luò)基礎(chǔ)編程66
inet_ntop()函數(shù)格式:6.2網(wǎng)絡(luò)基礎(chǔ)編程67
一個流程:使用TCP時Socket編程6.2網(wǎng)絡(luò)基礎(chǔ)編程68
6.2.3套接字編程示例:分為服務(wù)器端和客戶端兩部分服務(wù)器端——先建立socket→與本地端口進行綁定→接收客戶端的連接請求并建立與它的連接→接收客戶端發(fā)送的消息并顯示→退出??蛻舳恕ocket→與本地端口綁定→向服務(wù)器發(fā)送連接請求→向服務(wù)器發(fā)送消息→退出。6.2網(wǎng)絡(luò)基礎(chǔ)編程server.cclient.c69
改進上述程序:1)服務(wù)器端顯示與之建立連接的客戶端的地址信息。2)客戶端指定端口。3)實現(xiàn)雙方多次發(fā)送/接收消息。6.2網(wǎng)絡(luò)基礎(chǔ)編程70
實戰(zhàn):多進程和多線程是網(wǎng)絡(luò)編程中常用的事務(wù)處理方法。在示例程序的基礎(chǔ)上,使用多進程或多線程技術(shù),編程實現(xiàn)一個全雙工的網(wǎng)絡(luò)聊天程序。6.2網(wǎng)絡(luò)基礎(chǔ)編程71
在實際情況中,人們往往需要處理多個客戶端連接服務(wù)器的情況。而之前的實例中使用用阻塞函數(shù),因此如果資源沒有準(zhǔn)備好,則調(diào)用該函數(shù)的進程將進入睡眠狀態(tài),無法處理其他請求。本節(jié)將討論3種解決I/O多路利用的解決方法,分別為非阻塞和異步式處理(使用fcntl()函數(shù))以及多路復(fù)用(使用select()和poll()函數(shù))。6.3網(wǎng)絡(luò)高級編程72
非阻塞和異步I/O
在socket編程中可以使用函數(shù)fcntl(intfd,intcmd,intarg)的如下的編程特性。獲得文件狀態(tài)標(biāo)志:將cmd設(shè)置為F_GETFL,會返回由fd指向的文件的狀態(tài)標(biāo)志(使用open函數(shù)打開文件時設(shè)置的flags)。非阻塞I/O:將cmd設(shè)置為F_SETFL,將arg設(shè)置為O_NONBLOCK。異步I/O:將cmd設(shè)置為F_SETFL,將arg設(shè)置為O_ASYNC
6.3網(wǎng)絡(luò)高級編程73
非阻塞I/O
示例:如何設(shè)置文件狀態(tài)標(biāo)志
intflag flag=fcntl(sockfd,F_GETFL,0); flag|=O_NONBLOCK; fcntl(sockfd,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年日照五蓮縣教體系統(tǒng)公開招聘博士研究生備考題庫附答案
- 2025年度河南交通投資集團有限公司公開招聘82人社招+校招模擬試卷附答案
- 2025年福建省寧德人民醫(yī)院招聘9人備考題庫附答案
- 2025江蘇蘇州高新區(qū)(虎丘區(qū))社會事業(yè)局公益性崗位招聘2人備考題庫附答案
- 2025年龍沙區(qū)五龍街道公益性崗位招聘2人(公共基礎(chǔ)知識)綜合能力測試題附答案
- 2026榆林子洲縣裴家灣中心衛(wèi)生院招聘筆試參考題庫及答案解析
- 項目年終述職匯報【演示文檔課件】
- 2025秋人教版道德與法治八年級上冊9.2奉獻社會我踐行課件
- 2026云南高黎貢山國家級自然保護區(qū)保山管護局招聘公益性崗位人員1人筆試備考試題及答案解析
- 2026湖南省交通科學(xué)研究院有限公司招聘中層管理人員5人筆試備考試題及答案解析
- 清華大學(xué)教師教學(xué)檔案袋制度
- 公租房完整租賃合同范本
- 東南大學(xué)附屬中大醫(yī)院2026年招聘備考題庫及答案詳解參考
- 2025新疆阿瓦提縣招聘警務(wù)輔助人員120人參考筆試題庫及答案解析
- 貴州國企招聘:2025貴州鹽業(yè)(集團)有限責(zé)任公司貴陽分公司招聘考試題庫附答案
- 2025-2026學(xué)年秋季學(xué)期教學(xué)副校長工作述職報告
- GB/T 3098.5-2025緊固件機械性能第5部分:自攻螺釘
- 2026年服裝電商直播轉(zhuǎn)化技巧
- 2025-2026學(xué)年小學(xué)美術(shù)浙美版(2024)二年級上冊期末練習(xí)卷及答案
- 會所軟裝合同范本
- 沖刺2026中考-科學(xué)備考班會課件
評論
0/150
提交評論