新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于uCLinux和ARM7的網(wǎng)絡(luò)通信設(shè)計(jì)

基于uCLinux和ARM7的網(wǎng)絡(luò)通信設(shè)計(jì)

作者: 時(shí)間:2013-04-12 來源:網(wǎng)絡(luò) 收藏


3.1 中socket編程中用到的函數(shù)

(1) socket函數(shù)

為了執(zhí)行I/O,一個(gè)進(jìn)程必須做的第一件事情就是調(diào)用socket函數(shù),指定期望的通信協(xié)議類型(使用IPv4的TCP、使用IPv6的UDP、Unix域字節(jié)流協(xié)議等),其函數(shù)結(jié)構(gòu)如下:int socket(int family,int type,int protocol);

/*返回:非負(fù)描述字—成功,-1—出錯(cuò)*/

代碼中的family指明協(xié)議族。套接口的類型type是某個(gè)常值。一般來說,函數(shù)socket的參數(shù)protocol主設(shè)置為0,socket函數(shù)成功時(shí)返回一個(gè)小的非負(fù)整數(shù)值。為了得到這個(gè)數(shù)值,我們指定協(xié)議族(IPv4IP、v6或Unix)和套接口類型(字節(jié)流、數(shù)據(jù)報(bào)或原始套接口)。
(2)connect函數(shù)

TCP客戶用connect函數(shù)來建立一個(gè)與TCP服務(wù)器的連接。

Int connect(int sockfd,const struct sockaddr* servaddr,socklen_t addrlen);/*返回:0—成功,-1—出錯(cuò)*/

Sockfd由socket函數(shù)返回?cái)?shù)值,第二、第三個(gè)參數(shù)分別是一個(gè)批晌套接口地址結(jié)構(gòu)的指針和該結(jié)構(gòu)的大小。套接口葉址結(jié)構(gòu)必須含有服務(wù)器的IP地址和端口號(hào)。


(3)bind函數(shù)

函數(shù)bind給套接口分配一個(gè)本地協(xié)議地址。對(duì)于網(wǎng)際協(xié)議,協(xié)議地址是非顛倒2位IPv4地址16位的TCP或UDP端口號(hào)的組合。

Int bind(int sockfd,const struct sockaddr* myaddr,socklen_t addrlen);/*返回:0—成功,-1—出錯(cuò)*/

第二個(gè)參數(shù)量個(gè)指向特定于協(xié)議地址結(jié)構(gòu)的指針,第三個(gè)參數(shù)是該地址結(jié)構(gòu)的長(zhǎng)度。對(duì)于TCP,調(diào)用函數(shù)bind可以指定一個(gè)端口,指定一個(gè)IP地址??梢詢烧叨贾付ǎ部梢砸粋€(gè)也不指定。

(4)listen函數(shù)

函數(shù)listen僅被除數(shù)TCP服務(wù)器調(diào)用。它做兩件事件事情,當(dāng)函數(shù)socket創(chuàng)建一個(gè)套接口時(shí),被假設(shè)為一個(gè)主動(dòng)套接口。也就是說,它是一個(gè)將調(diào)用connect發(fā)起連接的客戶套接口,函數(shù)listen將未連接的套接口轉(zhuǎn)換成被動(dòng)套接口,指示內(nèi)核應(yīng)接受指向此套接口的連接請(qǐng)求。根據(jù)TCP狀態(tài)轉(zhuǎn)換調(diào)用函數(shù)listen導(dǎo)致套接口從CLOSED狀態(tài)轉(zhuǎn)換到LISEN狀態(tài)。函數(shù)的第二個(gè)參數(shù)規(guī)定了內(nèi)核為此套接口排隊(duì)的最大連接個(gè)數(shù)。

Int listen(int sockfd,int backlog);

/*返回:0—成功,-1—出錯(cuò)*/

一般來說,此函數(shù)應(yīng)在調(diào)用函數(shù)socket和bind之后,調(diào)用函數(shù)accept之前調(diào)用。

(5)accept函數(shù)

accept函數(shù)由TCP服務(wù)器調(diào)用,從已完成連接隊(duì)列頭返回下一個(gè)已完成連接。若已完成連接隊(duì)列為空,則進(jìn)程睡眠。(假定套接口噗缺省的阻塞方式)

int accept(int sockfd,struct sockaddr*cliaddr,socklen_t*addrlen);/*返回非負(fù)數(shù)值—OK,-1—出錯(cuò)*/

參數(shù)cliaddr和addrlen用來返回連接對(duì)方進(jìn)程(客戶)的協(xié)議地址。Addrlen是結(jié)果參數(shù),調(diào)用前,將由*addrlen所指示的整數(shù)值置為由cliaddr所旨的套接口地址結(jié)構(gòu)的長(zhǎng)度,返回時(shí),此整數(shù)值即為由內(nèi)核存在此套接口地址結(jié)構(gòu)內(nèi)的準(zhǔn)確字節(jié)數(shù)。
3.2 uClinux中編程的實(shí)現(xiàn)

中進(jìn)行socket編程,一般按照?qǐng)D書資料所示流程編寫網(wǎng)絡(luò)應(yīng)用程序。

除了熟悉前文提出的函數(shù)外,還應(yīng)知道兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu)。因?yàn)樵谟?jì)算機(jī)中,數(shù)據(jù)存儲(chǔ)有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯(lián)網(wǎng)上,數(shù)據(jù)是以高位字節(jié)優(yōu)先順序傳輸?shù)?,所以?duì)于在內(nèi)部以低位字節(jié)優(yōu)先方式存儲(chǔ)的數(shù)據(jù),需要進(jìn)行轉(zhuǎn)換才能在互聯(lián)網(wǎng)上傳輸。

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


數(shù)字通信相關(guān)文章:數(shù)字通信原理


通信相關(guān)文章:通信原理




評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉