<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 嵌入式Linux網(wǎng)絡(luò )編程之:網(wǎng)絡(luò )基礎編程

嵌入式Linux網(wǎng)絡(luò )編程之:網(wǎng)絡(luò )基礎編程

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257116.htm

10.2網(wǎng)絡(luò )基礎編程

10.2.1socket概述

1.socket定義

在Linux中的是通過(guò)socket接口來(lái)進(jìn)行的。人們常說(shuō)的socket是一種特殊的I/O接口,它也是一種文件描述符。socket是一種常用的進(jìn)程之間通信機制,通過(guò)它不僅能實(shí)現本地機器上的進(jìn)程之間的通信,而且通過(guò)網(wǎng)絡(luò )能夠在不同機器上的進(jìn)程之間進(jìn)行通信。

每一個(gè)socket都用一個(gè)半相關(guān)描述{協(xié)議、本地地址、本地端口}來(lái)表示;一個(gè)完整的套接字則用一個(gè)相關(guān)描述{協(xié)議、本地地址、本地端口、遠程地址、遠程端口}來(lái)表示。socket也有一個(gè)類(lèi)似于打開(kāi)文件的函數調用,該函數返回一個(gè)整型的socket描述符,隨后的連接建立、數據傳輸等操作都是通過(guò)socket來(lái)實(shí)現的。

2.socket類(lèi)型

常見(jiàn)的socket有3種類(lèi)型如下。

(1)流式socket(SOCK_STREAM)。

流式套接字提供可靠的、面向連接的通信流;它使用TCP協(xié)議,從而保證了數據傳輸的正確性和順序性。

(2)數據報socket(SOCK_DGRAM)。

數據報套接字定義了一種無(wú)連接的服務(wù),數據通過(guò)相互獨立的報文進(jìn)行傳輸,是無(wú)序的,并且不保證是可靠、無(wú)差錯的。它使用數據報協(xié)議UDP。

(3)原始socket。

原始套接字允許對底層協(xié)議如IP或ICMP進(jìn)行直接訪(fǎng)問(wèn),它功能強大但使用較為不便,主要用于一些協(xié)議的開(kāi)發(fā)。

10.2.2地址及順序處理

1.地址結構相關(guān)處理

(1)數據結構介紹。

下面首先介紹兩個(gè)重要的數據類(lèi)型:sockaddr和sockaddr_in,這兩個(gè)結構類(lèi)型都是用來(lái)保存socket信息的,如下所示:

structsockaddr

{

unsignedshortsa_family;/*地址族*/

charsa_data[14];/*14字節的協(xié)議地址,包含該socket的IP地址和端口號。*/

};

structsockaddr_in

{

shortintsa_family;/*地址族*/

unsignedshortintsin_port;/*端口號*/

structin_addrsin_addr;/*IP地址*/

unsignedcharsin_zero[8];/*填充0以保持與structsockaddr同樣大小*/

};

這兩個(gè)數據類(lèi)型是等效的,可以相互轉化,通常sockaddr_in數據類(lèi)型使用更為方便。在建立socketadd或sockaddr_in后,就可以對該socket進(jìn)行適當的操作了。

(2)結構字段。

表10.1列出了該結構sa_family字段可選的常見(jiàn)值。

表10.1

結構定義頭文件

#includenetinet/in.h>

sa_family

AF_INET:IPv4協(xié)議

AF_INET6:IPv6協(xié)議

AF_LOCAL:UNIX域協(xié)議

AF_LINK:鏈路地址協(xié)議

AF_KEY:密鑰套接字(socket)

sockaddr_in其他字段的含義非常清楚,具體的設置涉及其他函數,在后面會(huì )有詳細的講解。

2.數據存儲優(yōu)先順序

(1)函數說(shuō)明。

計算機數據存儲有兩種字節優(yōu)先順序:高位字節優(yōu)先(稱(chēng)為大端模式)和低位字節優(yōu)先(稱(chēng)為小端模式,PC機通常采用小端模式)。Internet上數據以高位字節優(yōu)先順序在網(wǎng)絡(luò )上傳輸,因此在有些情況下,需要對這兩個(gè)字節存儲優(yōu)先順序進(jìn)行相互轉化。這里用到了4個(gè)函數:htons()、ntohs()、htonl()和ntohl()。這4個(gè)地址分別實(shí)現網(wǎng)絡(luò )字節序和主機字節序的轉化,這里的h代表host,n代表network,s代表short,l代表long。通常16位的IP端口號用s代表,而IP地址用l來(lái)代表。

(2)函數格式說(shuō)明。

表10.2列出了這4個(gè)函數的語(yǔ)法格式。

表10.2 htons等函數語(yǔ)法要點(diǎn)

所需頭文件

#includenetinet/in.h>

函數原型

uint16_thtons(unit16_thost16bit)
uint32_thtonl(unit32_thost32bit)
uint16_tntohs(unit16_tnet16bit)
uint32_tntohs(unit32_tnet32bit)

函數傳入值

host16bit:主機字節序的16位數據

host32bit:主機字節序的32位數據

net16bit:網(wǎng)絡(luò )字節序的16位數據

net32bit:網(wǎng)絡(luò )字節序的32位數據

函數返回值

成功:返回要轉換的字節序

出錯:-1

注意

調用該函數只是使其得到相應的字節序,用戶(hù)不需清楚該系統的主機字節序和網(wǎng)絡(luò )字節序是否真正相等。如果是相同不需要轉換的話(huà),該系統的這些函數會(huì )定義成空宏。

3.地址格式轉化

(1)函數說(shuō)明。

通常用戶(hù)在表達地址時(shí)采用的是點(diǎn)分十進(jìn)制表示的數值(或者是以冒號分開(kāi)的十進(jìn)制IPv6地址),而在通常使用的socket編程中所使用的則是二進(jìn)制值,這就需要將這兩個(gè)數值進(jìn)行轉換。這里在IPv4中用到的函數有inet_aton()、inet_addr()和inet_ntoa(),而IPv4和IPv6兼容的函數有inet_pton()和inet_ntop()。由于IPv6是下一代互聯(lián)網(wǎng)的標準協(xié)議,因此,本書(shū)講解的函數都能夠同時(shí)兼容IPv4和IPv6,但在具體舉例時(shí)仍以IPv4為例。

這里inet_pton()函數是將點(diǎn)分十進(jìn)制地址映射為二進(jìn)制地址,而inet_ntop()是將二進(jìn)制地址映射為點(diǎn)分十進(jìn)制地址。

(2)函數格式。

表10.3列出了inet_pton函數的語(yǔ)法要點(diǎn)。

表10.3 inet_pton函數語(yǔ)法要點(diǎn)

所需頭文件

#includearpa/inet.h>

函數原型

intinet_pton(intfamily,constchar*strptr,void*addrptr)

函數傳入值

family

AF_INET:IPv4協(xié)議

AF_INET6:IPv6協(xié)議

strptr:要轉化的值

addrptr:轉化后的地址

函數返回值

成功:0

出錯:-1

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程



上一頁(yè) 1 2 3 4 5 6 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>