999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

一種支持多客戶端的TCP服務器模型

2019-09-09 13:33:49羅顯庭黎艷群
數(shù)碼世界 2019年6期
關(guān)鍵詞:方法

羅顯庭 黎艷群

摘要:TCP服務器程序在現(xiàn)今網(wǎng)絡發(fā)達的儀器儀表中應用廣泛。本文以降低設計人員開發(fā)難度為目的,從模塊化的設計思想出發(fā),提出一種支持多客戶端的TCP服務器模型。

關(guān)鍵詞:TCP服務器單線程多客戶端類 回調(diào)函數(shù)

在嵌入式儀器儀表中,經(jīng)常會遇到需要通過TCP和第三方設備進行通信。開發(fā)人員每天忙碌在重復繁瑣的編碼工作中,為儀表編寫不同的應用層協(xié)議以適配現(xiàn)場的工作需要。雖然編寫TCP服務器程序有很多種形式,例如為每個客戶端fork出單獨的進程或者為每個客戶端創(chuàng)建單獨的線程,這樣勢必增加系統(tǒng)的開銷,占用過多的資源。本文從通用性和可移植性等方便考慮,實現(xiàn)一種支持多客戶端的TCP服務器模型,減少后期代碼的重復編寫。

TCP服務器模型首先抽象為類的方式,具體數(shù)據(jù)的實時處理則交由回調(diào)函數(shù)去完成,將數(shù)據(jù)收發(fā)和協(xié)議解析部分分離,減輕開發(fā)人員的編碼工作、增強程序的穩(wěn)定性。

抽象出的類主要有以下幾個方法:服務器打開、關(guān)閉、線程啟動、數(shù)據(jù)發(fā)送和接收等,具體實現(xiàn)接口如下

服務器打開方法Open:

該方法主要用于定義監(jiān)聽服務器的IP地址和端口號,同時設置為非阻塞模式以及限制最大連接數(shù)量。調(diào)用成功返回服務器的套接字句柄,否則返回無效句柄。具體實現(xiàn)流程如下:

服務器關(guān)閉方法Close

主要用來關(guān)閉已連接或未釋放的客戶端套接字,同時在應用程序退出前關(guān)閉服務器自身用于監(jiān)聽的套接字。

客戶端數(shù)據(jù)發(fā)送的方法SendData

此方法由兩個函數(shù)組成,一個函數(shù)用于在已經(jīng)連接上的客戶端隊列中搜索,當前是和哪個客戶端套接字進行數(shù)據(jù)通信。另一個函數(shù)直接向?qū)奶捉幼职l(fā)送數(shù)據(jù)(注意在搜索套接字、發(fā)送數(shù)據(jù)失敗時需做重發(fā)或關(guān)閉等異常處理)。

服務器線程啟動方法StartThread

該方法主要用來定義兩個回調(diào)函數(shù),一個用于通知客戶端已連接的事件,另一個用于通知客戶端已接收到數(shù)據(jù)的事件。同時創(chuàng)建一個線程,用于服務器接受連接、客戶端的數(shù)據(jù)接收和關(guān)閉等操作。

服務器接收連接或客戶端數(shù)據(jù)接收的方法ThreadFun

該方法主要實現(xiàn)不斷地監(jiān)測服務器監(jiān)聽端口是否有新的接收連接,已連接的客戶端是否有數(shù)據(jù)發(fā)送過來,以及是否有客戶端申請關(guān)閉斷開等操作。

在一個線程中實現(xiàn)多個客戶端連接和服務器監(jiān)聽功能,主要使用到了select系統(tǒng)調(diào)用。Select系統(tǒng)調(diào)用允許程序同時在多個底層文件描述符上等待輸入的到達。這意味著服務器可以同時在多個打開的套接字上處理多個客戶端的請求動作。具體處理流程如下:

服務器讓select同時指向檢查監(jiān)聽套接字和客戶的連接套接字的Fd_set集合,通過用select調(diào)用同時處理多個客戶就不需再依賴多進程或多線程了。一旦select有活動發(fā)生,就可以用FD_ISSET來遍歷所有可能的文件描述符,以檢查是哪個套接字有活動發(fā)生。

如果是監(jiān)聽套接字可讀,這說明當前有一個客戶試圖建立連接,此時就可以調(diào)用accept而不用擔心發(fā)生阻塞的可能,同時利用客戶端連接回調(diào)函數(shù)通知應用層有新的客戶連接。

如果是某個客戶描述符準備好,說明該描述符上有一個客戶請求需要我們讀取和處理。如果讀操作返回零字節(jié),表示有客戶已結(jié)束,就從客戶端隊列中搜索關(guān)閉對應的套接字,并把它從文件符集合中刪除。如果返回的數(shù)據(jù)大于零,就直接讀取數(shù)據(jù),同時通過客戶端數(shù)據(jù)接收回調(diào)函數(shù)將接收到的數(shù)據(jù)通知上層進行數(shù)據(jù)解析和處理。

模型的實例化使用整個操作如下,定義一個服務器對象,打開對應的監(jiān)聽端口號,定義兩個回調(diào)函數(shù),啟動線程處理函數(shù)。

在上層的調(diào)用程序中只要定義兩個回調(diào)函數(shù)就可以,tcp_accept函數(shù)實現(xiàn)有新客戶連接需要處理的功能,custom_recv函數(shù)實現(xiàn)客戶端數(shù)據(jù)接收時需要進行的數(shù)據(jù)解析和處理功能即可。

在實際的工程應用中,此模型可以監(jiān)聽多個設備獲取不同設備的運行狀態(tài)數(shù)據(jù),功能強大。采用盡量少的線程數(shù)量和限制客戶端的連接數(shù)量,系統(tǒng)開銷小。同時采用非阻塞模式防止程序干擾其他設備的請求響應,響應快速。TCP服務實現(xiàn)和協(xié)議解析部分分離,代碼可移植性強,性能穩(wěn)定。

參考文獻

[1]陳健、宋健健譯.《Linux程序設計》(第3版)人民郵電出版社.

猜你喜歡
方法
中醫(yī)特有的急救方法
中老年保健(2021年9期)2021-08-24 03:52:04
高中數(shù)學教學改革的方法
河北畫報(2021年2期)2021-05-25 02:07:46
化學反應多變幻 “虛擬”方法幫大忙
變快的方法
兒童繪本(2020年5期)2020-04-07 17:46:30
學習方法
用對方法才能瘦
Coco薇(2016年2期)2016-03-22 02:42:52
最有效的簡單方法
山東青年(2016年1期)2016-02-28 14:25:23
四大方法 教你不再“坐以待病”!
Coco薇(2015年1期)2015-08-13 02:47:34
賺錢方法
捕魚
主站蜘蛛池模板: 中文字幕在线不卡视频| 久久国产毛片| 一本大道AV人久久综合| 国产农村妇女精品一二区| 亚洲区第一页| 欧美劲爆第一页| 成人亚洲国产| 欧美无专区| 五月天丁香婷婷综合久久| 国产专区综合另类日韩一区| 99视频精品在线观看| 亚洲综合第一页| 久久9966精品国产免费| 亚洲啪啪网| 最新国产成人剧情在线播放| 丝袜亚洲综合| 少妇露出福利视频| 国产精品成人一区二区| 乱系列中文字幕在线视频| 亚洲国产无码有码| 国产福利不卡视频| 玖玖精品视频在线观看| 国内自拍久第一页| 免费看一级毛片波多结衣| 色悠久久久久久久综合网伊人| 久久婷婷色综合老司机| 一区二区无码在线视频| 久久精品aⅴ无码中文字幕| 国产尤物视频在线| 波多野结衣一区二区三视频 | 国产小视频在线高清播放| 国产对白刺激真实精品91| 青青草国产在线视频| 美美女高清毛片视频免费观看| www.99在线观看| 久久精品人人做人人综合试看| AV不卡无码免费一区二区三区| 成年A级毛片| 爱爱影院18禁免费| 婷婷中文在线| www.国产福利| 亚洲六月丁香六月婷婷蜜芽| 欧美乱妇高清无乱码免费| 伊人国产无码高清视频| 日韩天堂视频| 亚洲精品动漫| 香蕉精品在线| 久久人人97超碰人人澡爱香蕉| 国产在线视频欧美亚综合| 日韩美毛片| 精品国产91爱| 无码电影在线观看| 人人妻人人澡人人爽欧美一区| 亚洲一级无毛片无码在线免费视频 | 欧美日韩午夜| 久久这里只有精品66| 久草视频中文| 国产美女在线免费观看| 免费又爽又刺激高潮网址| V一区无码内射国产| 熟妇丰满人妻| 国产精品欧美在线观看| 毛片免费观看视频| 国产成人高清亚洲一区久久| 国产办公室秘书无码精品| 日韩麻豆小视频| 久久99精品久久久久久不卡| 亚洲午夜久久久精品电影院| 久久精品视频亚洲| 日本不卡在线视频| 污视频日本| 久草性视频| 丁香婷婷综合激情| 亚洲69视频| 亚洲乱码在线播放| 国产肉感大码AV无码| 久久亚洲精少妇毛片午夜无码| 国产精品永久在线| 免费国产在线精品一区| 国产亚洲精品自在久久不卡| 亚洲第一中文字幕| 国内嫩模私拍精品视频|