<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計

          基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計

          作者: 時間:2016-09-12 來源:網(wǎng)絡(luò) 收藏

          bind (listen_fd,(struct sockaddr*)client_addr,sizeof(client_addr))

          當(dāng)調(diào)用socket0函數(shù)創(chuàng)建一個套接字時,默認情況下它是一個主動套接字。所以對于TCP服務(wù)器,在綁定操作后,必須要調(diào)用listen0函數(shù),將這個未連接的套接字轉(zhuǎn)換。

          成被動套接字,使它處在監(jiān)聽模式下,指示內(nèi)核應(yīng)接受發(fā)向該套接字的連接請求。在調(diào)用listen0函數(shù)后,服務(wù)器的狀態(tài)從close轉(zhuǎn)換到listen狀態(tài)。Listen第二個狀態(tài)字代表的是最大連接數(shù),本系統(tǒng)設(shè)置的最大連接數(shù)為10。

          listen(listen_fd,10);

          接受客戶連接,客戶協(xié)議地址和長度省略接收,失敗accept_fd=-1,置errno。如果建立連接。并且fork0=0,那么程序就進入子進程進行執(zhí)行。

          accept_fd=accept(listen_fd,NULL,NULL);

          清除一個文件描述符集,并將一個新文件描述符加入文件描述符集中,其作用就是更新文件描述符。

          FD_ZERO(fds);

          FD_SET(aecept_fd,fds);

          函數(shù)select0是給出每個描述符我們所關(guān)心的條件:是否讀描述符、是否想寫描述符、是否描述符的異常條件。tv指等待時間。FD_ISS ET()測試該集中的一個給定位是否有變化、更新。

          retval=select(accept_fd+1,fds,NULL,NULL,tv);

          FD_ISSET(accept_fd,fds)

          調(diào)用read0可以接收buffer數(shù)據(jù)緩沖區(qū),1 024指接收數(shù)據(jù)緩沖區(qū)大小,n為接收字節(jié)數(shù)。

          n=read(aecept_fd,buffer,1 024);

          調(diào)用子程序modbus.c,執(zhí)行相應(yīng)操作,調(diào)用make_modbus_ack0生成回發(fā)數(shù)據(jù),并通過send0回發(fā)給客戶端。

          send_count=make_modbus_ack(buffer,n);

          send(accept_fd,buffer,send_count,0)

          3 ARM-Linux多進程服務(wù)移植與實現(xiàn)

          3.1 程序編譯移植

          Makefile的作用就是讓編譯器知道要編譯一個文件需要依賴哪些文件,同時當(dāng)那些依賴文件更新時,編譯器會自動發(fā)現(xiàn)最終生成的文件已經(jīng)過時,而重新編譯相應(yīng)模塊。Makefile定義了一系列規(guī)則來指定各文件,如依賴性、先后順序及是否需要更新等。

          ARM平臺上的Makefile

          CROSS=arm-linux-

          arm-modbus-server.main.c modbus.c

          $(CROSS)gcc-o arm-modbus-server main.c modbus.c

          clean:

          rm-vf*.o

          編譯譯基于ARM的modbus網(wǎng)絡(luò)程序如下圖,首先我們看到文件夾里沒有可執(zhí)行文件arm-modbus-server,輸入:#make

          執(zhí)行Makefile文件,進行編譯連接依賴文件:main.c、modbus.c、std_c.h。

          然后生成我們所需要的文件arm-modbus-server。

          3.2 并發(fā)服務(wù)器測試

          本測試是基于ARM9的linux2.9內(nèi)核平臺。首先使用chmod修改arm-modbus-server執(zhí)行權(quán)限,然后運行./arm-modbus-server即服務(wù)器程序已經(jīng)啟動。

          啟用兩個客戶端通過IP訪問服務(wù)器,可見如圖5所示,已顯示并發(fā)服務(wù)器運行正常。

          基于ARM-Linux嵌入式系統(tǒng)的多進程并發(fā)服務(wù)器設(shè)計

          4 結(jié)論

          本文詳細介紹了并發(fā)服務(wù)器的原理結(jié)構(gòu),分析了基于linux下的并發(fā)服務(wù)器程序代碼,并且移植到ARM平臺上運行,實現(xiàn)了小型嵌入式服務(wù)器的制作。這種低成本、低噪聲、低功耗、高穩(wěn)定性、高安全性的嵌入式服務(wù)器,將在我們信息化發(fā)展中的智能樓宇、智能家電、智能移動設(shè)備中獲得應(yīng)用。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();