嵌入式作業系統uClinux下的網路socket編程

來源:互聯網
上載者:User

二、嵌入式作業系統uClinux下的網路socket編程
    網路的Socket資料轉送是一種特殊的I/O,Socket也是一種檔案描述符。Socket也具有一個類似於開啟檔案的函數調用;Socket()函數返回一個整型的Socket描述符,隨後的串連建立、資料轉送等操作都是通過該Socket實現的。常用的Socket類型有兩種:流式Socket:SOCK_STREAM和資料報式Socket:SOCK_DGRAM。流式是一種連線導向的Socket,針對於連線導向的TCP服務應用;資料報式Socket是一種不需連線的Socket,對應於不需連線的UDP服務應用。
1 uCLinux中socket編程中用到的函
    (1)socket函數:int socket(int domain, int type, int protocol);
    為了執行I/O,一個進程必須做的第一件事情就是調用socket函數,指定期望的通訊協定類型(使用IPv4的TCP、使用IPv6的UDP、Unix域位元組流協議等)。
    (2)connect函數: int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);TCP客戶用connect函數來建立一個與TCP伺服器的串連。
    (3)bind函數:int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
    函數bind給套介面分配一個本地協議地址。對於網際協議,協議地址是非顛倒2位IPv4地址16位的TCP或UDP連接埠號碼的組合。
(4)listen函數: int listen(int sockfd, int backlog);
    函數listen僅被TCP伺服器調用。它做兩件事件事情,當函數socket建立一個套介面時,被假設為一個主動套介面。也就是說,它是一個將調用connect發起串連的客戶套介面,函數listen將未串連的套介面轉換成被動套介面,指示核心應接受指向此套介面的串連請求。根據TCP狀態轉換調用函數listen導致套介面從CLOSED狀態轉換到LISEN狀態。一般來說,此函數應在調用函數socket和bind之後,調用函數accept之前調用。
    (5)accept函數: int accept(int sockfd, void *addr, int *addrlen);
    accept函數由TCP伺服器調用,從已完成串連隊列頭返回下一個已完成串連。若已完成串連隊列為空白,則進程睡眠。(假定套介面是預設的阻塞方式)
    (6)send() and recv()函數:
int send(int sockfd, const void *msg, int len, int flags);
int recv(int sockfd, void *buf, int len, unsigned int flags);
    這兩個函數用於流式通訊端或者資料通訊端的通訊,使用不需連線的資料通訊端,應該使用於sendto() 和 recvfrom()函數

2 uClinux中網路通訊編程的實現
    TCP/IP網路中兩個進程間的相互作用的主機模式是客戶機/伺服器模式(Client/Server model)。該模式的建立基於以下兩點:
    1)、非對等作用;
    2)、通訊完全是非同步。客戶機/伺服器模式在操作過程中採取的是主動請示方式:
   首先伺服器方要先啟動,並根據請示提供相應服務:(過程如下)
    1.開啟一通訊通道並告知本地主機,它願意在某一個公認地址上接收客戶請求;
    2.等待客戶請求到達該連接埠;
    3.接收到重複服務要求,處理該請求並發送應答訊號;
    4.返回第二步,等待另一客戶請求;
    5.關閉伺服器;
客戶方:
    1.開啟一通訊通道,並串連到伺服器所在主機的特定連接埠;
    2.向伺服器發送服務要求報文,等待並接收應答;繼續提出請求……;
    3.請求結束後關閉通訊通道並終止;
    根據上面介紹的socket函數我們可以畫出連線導向的通訊端的系統調用時序圖:
 
    在這裡要說明的是電腦資料存放區有兩種位元組優先順序:高位位元組優先和低位位元組優先。Internet上資料以高位位元組優先順序在網路上傳輸,所以對於在內部是以低位位元組優先方式儲存資料的機器,在Internet上傳輸資料時就需要進行轉換。
    應該說uClinux同標準Linux的最大區別就在於記憶體管理,同時也由於uClinux的記憶體管理引發了一些標準Linux所不會出現的問題。uClinux對記憶體的管理減少同時就給開發人員提出了更高的要求。由於應用程式載入時必須分配連續的地址空間,而針對不同硬體平台的可一次成塊(連續地址)分配記憶體大小限制是不同,所以開發人員在開發應用程式時必須考慮記憶體的分配情況並關注應用程式需要Runspace的大小。另外由於採用實儲存空間管理原則,使用者程式同核心以及其它使用者程式在一個地址空間,程式開發時要保證不侵犯其它程式的地址空間,以使得程式不至於破壞系統的正常工作,或導致其它程式的運行異常。從記憶體的訪問角度來看,開發人員的權利增大了(開發人員在編程時可以訪問任意的地址空間),但與此同時系統的安全性也大為下降。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.