新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于ARM-Linux嵌入式系統的多進程并發服務器設計

        基于ARM-Linux嵌入式系統的多進程并發服務器設計

        作者: 時間:2016-09-12 來源:網絡 收藏

        摘要:隨著、智能電網、智能移動設備的發展,我們將能在任何時候任何地方獲取我們所需的信息,本文設計一款基于。它擁有傳統服務器的功能,可遠程訪問和操作,同時又具有體積小、噪聲低、低功耗、低成本的優勢,非常適合用于智能樓宇的家用服務器。

        本文引用地址:http://www.104case.com/article/201609/304671.htm

        目前大家所用的大多是X86服務器,其功能完善、運行速度快、軟件支持性好等優點,已被人們普遍認同。但其由于價格昂貴、功耗高、噪聲大等原因,一般只應用于工廠、企事業單位,但隨著互連網的發展,我們需要更多的小型服務器終端,因此,低成本、低功耗的嵌入式服務器將有極大的應用空間。

        面向連接的并發服務器是目前Linux網絡服務器的主流形式。它采用主、從服務器的工作方式,能較好地解決了網絡中客戶進程的并發請求問題。目前在嵌入式領域,基于ARM技術的微處理器應用約占據了32位RISC微處理器80%以上的市場份額,同時,ARM處理器和嵌入式Linux的結合也正變得越來越緊密,在工業控制、消費類電子產品、通信系統、無線系統等各類產品市場都可以看到ARM與Linux相結合的身影。因此,本文介紹了一種基于設計。

        1 并發服務器原理及框架

        1. 1 基本的C/S服務模型

        相互通信的網絡程序通常可以分為客戶端和服務器端兩部分。簡單的C/S服務模式客戶端和服務器采用的是一對一的關系,而實際上一個客戶同時可以與多個服務器通信,一個服務器同時也能與多個客戶通信。

        Linux下使用TCP套接字編程可以實現基于TCP/IP協議的面向連接的通信,它分為服務器端和客戶端兩部分,如圖1所示。

        基于ARM-Linux嵌入式系統的多進程并發服務器設計

        服務器端與客戶端連接的步驟如下:

        1)使用socket0函數創建套接字;

        2)將創那的套接字綁定到指定的地址結構

        3)Listen0函數設置套接字為監聽模式,使服務器進入被動打開的狀態

        4)接受客戶端的連接請求,建立連接

        5)終止連接

        客戶端實現步驟:

        1)使用socket0函數創建套接字

        2)調用connect0函數建立一個TCP服務器的連接

        3)發送數據請求,接收服務器的數據應答

        4)終止連接

        這樣就建立了最簡單的C/S連接模式,而所有基于TCP套接字的網絡服務也都是建立在這個基礎上的。

        1.2 模型

        前面介紹了簡單的TCP客戶端/服務器概念和連接,其中服務器每次只能處理一個客戶的請求,它的實現雖然很簡單但效率卻很低,在實際應用中,這樣的服務器是不能滿足實際需求的。

        在實際應用中為了讓一個服務器同時為多個客戶服務,處理多個客戶的請求,那么就需要用并發服務器。Linux下主要支持的并發服務器有進程、線程。創建線程要比進程快,但一個進程內的所有線程共享相同的內存空間、全局變量等信息,所以當一個線程崩潰時,它會影響同一進程中的其他線程。

        Linux系統中可以同時存在多個進程,但相對線程來說,進程是獨立的。它擁有獨立的地址空間、執行堆棧、文件描述符等,在未經允許的情況下,一個進程不能訪問另一個進程的資源,因此一個進程崩潰不會造成其他進程的崩潰。由于考慮遠程監控系統要求的安全性和穩定性,本系統設計為多進程并發服務器。圖2為并發服務器的基本模型圖。

        基于ARM-Linux嵌入式系統的多進程并發服務器設計

        1.3 多進程服務器原理

        在多進程并發服務器中是通過調用fork或vfork函數來創建新進程。當父進程產生新的子進程后,父、子進程共享父進程在調用fork之前的所有描述符。接下來父進程只負責接收客戶請求,而子進程只負責處理客戶請求。

        圖3說明父進程調用fork生成子進程后,父、子進程對客戶請求和描述符的操作過程。

        基于ARM-Linux嵌入式系統的多進程并發服務器設計

        1)當服務器調用accept0函數時,連接請求從客戶到達服務器時雙方狀態。

        2)當客戶的請求被接受后。接下來服務器就會調用fork函數生成子進程。

        3)最后父進程關閉已連接描述符,由子進程關閉監聽描述符,這樣既可以節省系統資源,又可以防止父、子進程同時對共享描述符進程操作。至此子進程處理與客戶的連接,父進程可以對監聽描述符再次調用accept,繼續處理下一個客戶的請求。

        2 功能代碼分析

        網絡主程序設計其實主要也就是父進程所執行的程序,程序設計的流程圖如4所示。

        基于ARM-Linux嵌入式系統的多進程并發服務器設計

        linux中的網絡編程通過socket接口實現。socket既是一種特殊的I/O,它也是一種文件描述符。一個完整的socket包括協議、本地地址、本地端口、遠程地址、遠程端口;每一個socket有一個本地的唯一socket號,由操作系統自動分配。以下是建立TCP socket,其中AF_INET為IPv4,SOCK_STREAM為TCP協議,如建立失敗則返回-1。

        listen_fd=socket(AF_INET,SOCK_STREAM,0)

        調用bzero初始化套接字地址結構,并對地址結構中的成員賦值,代碼如下。

        bzero(client_addr,sizeof(struct sockaddr_in));

        client_addr.sin_family=AF_INET;

        client_addr.sin_port=htons(MY_PORT);

        client_addr.sin_addr.s_addr=htonl(INADDR_ANY);

        為了給調用socket0函數產生的套接字分配一個本地協議地址,建立地址與套接字的對應關系,就要用到綁定函數bind0。通過綁定后端口號保證了地址信息的唯一性。如失敗返回-1。


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 广元市| 邻水| 古浪县| 巴林右旗| 福建省| 绩溪县| 尖扎县| 柘荣县| 镇沅| 屏边| 忻州市| 上栗县| 吉水县| 天等县| 西峡县| 阜阳市| 石楼县| 棋牌| 宜兰县| 宜良县| 新丰县| 高邮市| 门源| 黄梅县| 星座| 江孜县| 平江县| 阜新市| 泸西县| 榆树市| 商水县| 拉孜县| 大庆市| 林周县| 视频| 乡宁县| 邵武市| 海南省| 独山县| 绵阳市| 禄丰县|