基于uCLinux和ARM7的網絡通信設計
3.1 uCLinux中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中網絡通信編程的實現
在uCLinux中進行socket編程,一般按照圖書資料所示流程編寫網絡應用程序。
除了熟悉前文提出的函數外,還應知道兩個重要的數據結構。因為在計算機中,數據存儲有兩種字節(jié)優(yōu)先順序:高位字節(jié)優(yōu)先和低位字節(jié)優(yōu)先。在互聯網上,數據是以高位字節(jié)優(yōu)先順序傳輸的,所以對于在內部以低位字節(jié)優(yōu)先方式存儲的數據,需要進行轉換才能在互聯網上傳輸。
linux相關文章:linux教程
數字通信相關文章:數字通信原理
通信相關文章:通信原理
評論