新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于uCLinux和ARM7的網絡通信設計

基于uCLinux和ARM7的網絡通信設計

作者: 時間:2013-04-12 來源:網絡 收藏


3.1 中socket編程中用到的函數

(1) socket函數

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

/*返回:非負描述字—成功,-1—出錯*/

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

TCP客戶用connect函數來建立一個與TCP服務器的連接。

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

Sockfd由socket函數返回數值,第二、第三個參數分別是一個批晌套接口地址結構的指針和該結構的大小。套接口葉址結構必須含有服務器的IP地址和端口號。


(3)bind函數

函數bind給套接口分配一個本地協(xié)議地址。對于網際協(xié)議,協(xié)議地址是非顛倒2位IPv4地址16位的TCP或UDP端口號的組合。

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

第二個參數量個指向特定于協(xié)議地址結構的指針,第三個參數是該地址結構的長度。對于TCP,調用函數bind可以指定一個端口,指定一個IP地址。可以兩者都指定,也可以一個也不指定。

(4)listen函數

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

Int listen(int sockfd,int backlog);

/*返回:0—成功,-1—出錯*/

一般來說,此函數應在調用函數socket和bind之后,調用函數accept之前調用。

(5)accept函數

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

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

參數cliaddr和addrlen用來返回連接對方進程(客戶)的協(xié)議地址。Addrlen是結果參數,調用前,將由*addrlen所指示的整數值置為由cliaddr所旨的套接口地址結構的長度,返回時,此整數值即為由內核存在此套接口地址結構內的準確字節(jié)數。
3.2 uClinux中編程的實現

中進行socket編程,一般按照圖書資料所示流程編寫網絡應用程序。

除了熟悉前文提出的函數外,還應知道兩個重要的數據結構。因為在計算機中,數據存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯網上,數據是以高位字節(jié)優(yōu)先順序傳輸的,所以對于在內部以低位字節(jié)優(yōu)先方式存儲的數據,需要進行轉換才能在互聯網上傳輸。

linux相關文章:linux教程


數字通信相關文章:數字通信原理


通信相關文章:通信原理




評論


相關推薦

技術專區(qū)

關閉