亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺談C#網絡編程(一)

2019-11-14 13:57:32
字體:
來源:轉載
供稿:網友

閱讀目錄:

  1. 基礎
  2. Socket編程
  3. 多線程并發
  4. 阻塞式同步IO

基礎

在現今軟件開發中,網絡編程是非常重要的一部分,本文簡要介紹下網絡編程的概念和實踐。
Socket是一種網絡編程接口,它是對傳輸層TCP、UDP通信協議的一層封裝,通過友好的API暴露出去,方便在進程或多臺機器間進行網絡通信。

Socket編程

在網絡編程中分客戶端和服務端兩種角色,比如通過打開瀏覽器訪問到掛在Web軟件上的網頁,從程序角度上來看,即客戶端(瀏覽器)發起了一個Socket請求到服務器端,服務器把網頁內容返回到瀏覽器解析后展示。在客戶端和服務端數據通信前,會進行三次確認才會正式建立連接,也即是三次握手。

  1. 客戶端發送消息詢問服務端是否準備好
  2. 服務端回應我準備好了,你呢準備好了嗎
  3. 客戶端回應服務端我也準備好了,可以通信了

TCP/ip協議是網絡間通信的基礎協議,在不同編程語言及不同操作系統下暴露的Socket接口用法也大同小異,僅是其內部實現有所不同,比如linux下的epoll和windows下的IOCP。

服務端

  • 實例化Socket
  • 把公共地址端口綁定操作系統上
  • 開始監聽綁定的端口
  • 等待客戶端連接
            IPEndPoint ip = new IPEndPoint(IPAddress.Any, 6389);            Socket listenSocket = new Socket(ip.AddressFamily, SocketType.Stream, PRotocolType.Tcp);            listenSocket.Bind(ip);            listenSocket.Listen(100);            listenSocket.Accept();

listen函數中有個int類型參數,它表示最大等待處理連接的數量,表示已建立連接但還未處理的數量,每調用Accept函數一下即從這個等待隊列中拿出一個連接。 通常服務端要服務多個客戶端請求的連接,所以會循環從等待隊列中拿出連接,進行接收發送。 

   while (true)             {                 var accept= listenSocket.Accept();                accept.Receive();                 accept.Send();             }

多線程并發

上面的服務端程序處理接收和發送消息都是在當前線程下完成的,這意味著要處理完一個客戶端連接后才能去處理下一個連接,如果當前連接是進行數據庫或者文件讀取寫入等IO操作,那會極大浪費服務器的CPU資源,降低了服務器吞吐量。

            while (true)            {                var accept = listenSocket.Accept();                ThreadPool.QueueUserWorkItem((obj) =>                {                    byte[] receive = new byte[100];                    accept.Receive(receive);                    byte[] send = new byte[100];                    accept.Send(receive);                });            }

如例子中,當監聽到有新連接請求過來時,調用Accept()取出當前連接的socket,使用新的線程去處理接收和發送信息,這樣服務端就能實現并發處理多個客戶端了。 上述代碼中,在高并發下其實是有問題的,如果客戶端連接請求成千上萬個,那線程數量也會有這么多,每個線程的棧空間都需要消耗部分內存,再加上線程上下文切換,容易導致服務器負載過高,吞吐量大大下降,嚴重時會引起宕機。 當前例子中使用系統ThreadPool的話,線程數量會固定在一個數量上,默認是1000,不會無限制開線程,會把處理超出線程數量的請求放到線程池中的隊列上面。

在unix下類似的實現有2種:

fork一個新進程去處理客戶端的連接:

var connfd = Accept(listenfd,(struct sockaddr *)&cliaddr,&cliaddr_len); var m = fork(); if(m == 0) { //do something } 

創建一個新的線程處理限流:

var *clientsockfd = accept(serversockfd,(struct sockaddr *)&clientaddress, (socklent *)&clientlen); if(pthreadcreate(&thread, NULL, recdata, clientsockfd)!=0) { //do something }

阻塞式同步IO

上述例子中使用的即是該模型,使用起來簡單方便。 

    while (true)            {                var accept = listenSocket.Accept();                byte[] receive = new byte[100];                accept.Receive(receive);                byte[] send = new byte[100];                accept.Send(receive);            }

從調用Receive函數起到接受到客戶端發過來的數據期間,該函數會一直阻塞等待著,這個阻塞期間處理流程如下:

  1. 客戶端發送數據
  2. 通過廣域網局域網發送到服務端機器網卡緩沖區上
  3. 網卡驅動對CPU發送中斷指令
  4. CPU把數據拷貝到內核緩沖區
  5. CPU再把內核緩沖區的數據拷貝用戶緩沖區,上面的receive字節數組。

至此處理成功,開始處理下一個連接請求。 調用發送函數同樣會阻塞在當前,然后把用戶緩沖區(send字節數組)數據拷貝到內核中TCP發送緩沖區中。 TCP的發送緩沖區也有一定的大小限制,如果發送的數據大于該限制,send函數會一直等待發送緩沖區有空閑時完全拷貝完才會返回,繼續處理后續連接請求。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久97| 欧美精品制服第一页| 国产精品免费久久久久影院| 最新中文字幕亚洲| 中文字幕日韩专区| 国产91精品视频在线观看| 国产欧美久久久久久| www.日韩免费| 亚洲国产成人一区| 色99之美女主播在线视频| 亚洲国产精品va| 欧美最近摘花xxxx摘花| 精品人伦一区二区三区蜜桃免费| 日本91av在线播放| 亚洲精品国产精品国产自| 在线观看视频99| 成人精品久久一区二区三区| 亚洲小视频在线观看| 亚洲成年人在线| 九九精品视频在线观看| 在线成人一区二区| 欧美精品在线网站| 国产成人精品日本亚洲| 免费成人高清视频| 亚洲午夜小视频| 欧美国产视频日韩| 日韩中文字幕视频| 日韩福利在线播放| 国模gogo一区二区大胆私拍| 欧美日韩在线另类| 国产mv免费观看入口亚洲| 国产99久久久欧美黑人| 久久久久久成人精品| 福利视频导航一区| 亚洲国产高清自拍| 成人午夜在线观看| 91精品国产综合久久香蕉的用户体验| 国产精品一区二区三| 亚洲国产小视频| 色综久久综合桃花网| 久久精品99久久久久久久久| 欧美激情喷水视频| 久久久久久久影院| 欧美日韩午夜剧场| 国产成人精品一区二区在线| 国产999精品视频| 久久精品久久久久| 亚洲国产中文字幕久久网| 中文字幕一区二区三区电影| 国产精品视频在线播放| 社区色欧美激情 | 久久久久久久久91| 日韩经典一区二区三区| 欧美性极品xxxx娇小| 4438全国成人免费| 精品亚洲va在线va天堂资源站| 亚洲精品免费在线视频| 久久久久久91香蕉国产| 国产亚洲精品激情久久| 欧美一级成年大片在线观看| 久久青草精品视频免费观看| 欧美怡春院一区二区三区| 免费91麻豆精品国产自产在线观看| 色综合天天狠天天透天天伊人| 色噜噜狠狠狠综合曰曰曰| 国产精品久久久久久亚洲影视| 成人午夜一级二级三级| 欧美丰满少妇xxxxx| 亚洲永久免费观看| 亚洲精品美女久久久久| 久久九九免费视频| 国产精品久久久久久亚洲影视| 国产精欧美一区二区三区| 欧美日韩国产中文精品字幕自在自线| 精品久久久久久国产| 欧美激情在线视频二区| 成人网在线免费看| 欧美极品少妇xxxxⅹ喷水| 日韩一区二区精品视频| 欧美色另类天堂2015| 欧洲精品久久久| 亚洲欧洲日产国码av系列天堂| 国产欧美日韩91| 2019中文字幕在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 啊v视频在线一区二区三区| 亚洲天堂第二页| 久久99久久亚洲国产| 原创国产精品91| 亚洲精品99999| 欧美精品第一页在线播放| 亚洲第一精品福利| 欧美久久精品午夜青青大伊人| 97视频在线观看网址| 国内精品在线一区| 秋霞成人午夜鲁丝一区二区三区| 久久夜精品香蕉| 欧美精品福利视频| 亚洲一区二区日本| 久久99国产综合精品女同| 亚洲午夜未满十八勿入免费观看全集| 日韩欧美成人精品| 91国自产精品中文字幕亚洲| 成人黄色av播放免费| 国产v综合ⅴ日韩v欧美大片| 成人在线激情视频| 国产精品免费一区二区三区都可以| 伦理中文字幕亚洲| 国产日韩专区在线| 91精品国产高清| 91sao在线观看国产| 国语自产精品视频在线看抢先版图片| 欧美色欧美亚洲高清在线视频| 亚洲欧美国产日韩中文字幕| 日韩男女性生活视频| 精品国产31久久久久久| 国产成人午夜视频网址| 国产亚洲欧美一区| 久久躁狠狠躁夜夜爽| 欧美猛交ⅹxxx乱大交视频| 成人高h视频在线| 97免费在线视频| 亚洲国产美女久久久久| 亚洲一区二区三区四区在线播放| 久久久在线视频| 精品国产一区二区在线| 欧美日韩免费一区| 久久国产精品久久久久久久久久| 国产精品海角社区在线观看| 精品国产一区二区三区久久狼黑人| 成人www视频在线观看| 亚洲国产婷婷香蕉久久久久久| 欧美日韩成人在线视频| 亚洲已满18点击进入在线看片| 国产精品久久久久av免费| 久久视频这里只有精品| 久久久久久91香蕉国产| 欧美大尺度电影在线观看| 亚洲女人天堂色在线7777| 中文字幕av一区| 亚洲精品456在线播放狼人| 国产精品香蕉在线观看| 亚洲香蕉成人av网站在线观看| 日韩成人在线视频| 日韩欧美极品在线观看| 欧美性精品220| 午夜精品久久久久久久男人的天堂| 538国产精品一区二区免费视频| 欧美老女人xx| 色偷偷88888欧美精品久久久| 亚洲成av人影院在线观看| 日韩在线视频导航| 欧美精品videossex88| 国内精品中文字幕| 日韩欧美成人网| 亚洲成人网av| 久久99视频免费| 久青草国产97香蕉在线视频| 精品无人区太爽高潮在线播放| 国产精品免费视频xxxx| 日韩中文有码在线视频| 久久久免费电影| 久久天天躁狠狠躁夜夜av| 亚洲精品小视频在线观看|