1. 程式人生 > >《TCP/IP網路程式設計》第12章 I/O複用

《TCP/IP網路程式設計》第12章 I/O複用

12.1 基於I/O複用的伺服器端

1.       多程序伺服器端的缺點

    為了構建併發伺服器,只要有客戶端連線請求就會建立新程序。這的確是實際作業系統中採用的一種方案,但並非十全十美,因為建立程序時需要大量的運算和記憶體空間,由於每個程序都具有獨立的記憶體空間,所以相互間的資料交換也要求採用相對複雜的方法(IPC屬於相對複雜的方法)。

2.       理解複用

    “在1個通訊頻道中傳遞多個數據(訊號)的技術。”

    時(time)分複用技術;

    頻(frequency)分複用技術;

3.       複用技術在伺服器端的應用

    多程序伺服器端:

    採用複用技術的伺服器端,無論連線多少客戶端,提供服務的程序只有

1個:

12.2 理解select函式並實現伺服器端

    運用select函式是最具代表性的實現複用伺服器端方法。

1.       select函式的功能和呼叫順序

    使用select函式時可以將多個檔案描述符集中到一起統一監視,監視項稱為“事件”(event):

  • 是否存在套接字接收資料?
  • 無需阻塞傳輸資料的套接字有哪些?
  • 哪些套接字發生了異常?

    select函式的呼叫方法和順序:

2.       設定檔案描述符

    利用select函式可以同時監視多個檔案描述符,監視檔案描述符可以視為監視套接字。此時首先需要將要監視的檔案描述符集中到一起。集中時要按照監視項(接收、傳輸、異常)進行區分,即按照上述

3種監視項分成3類。

    使用fd_set結構體變數執行此操作。該陣列是存有0和1的位陣列。

    最左端的位表示檔案描述符0(所在位置)。如果該位設定為1,則表示該檔案描述符是監視物件。

    在fd_set變數中註冊或更改值的操作都由下列巨集完成:

  • FD_ZERO(fd_set *fdset)將fd_set變數的所有位初始化為0;
  • FD_SET(int fd, fd_set *fdset)在引數fdset指向的變數中註冊檔案描述符fd的資訊;
  • FD_CLR(int fd, fd_set *fdset)從引數fdset指向的變數中清除檔案描述符fd的資訊;
  • FD_ISSET(int fd, fd_set *fdset)
    若引數fdset指向的變數中包含檔案描述符fd的資訊,則返回“真”;

3.       設定檢查(監視)範圍及超時

#include<sys/select.h>
#include<sys/time.h>
int select(int maxfd,fd_set *readset, fd_set *writeset, fd_set
           *exceptset, conststruct timeval *timeout);
//成功時返回大於0的值,失敗時返回-1

    -maxfd:被監聽檔案描述符個數,通常設定為監聽的所有描述符最大值加1因為檔案描述符是從0開始的;

    -readset:將所有關注“是否存在待讀取資料”的檔案描述符註冊到fd_set型變數,並傳遞其地址值;

    -writeset:將所有關注“是否可傳輸無阻塞資料”的檔案描述符註冊到fd_set型變數,並傳遞其地址值;

    -exceptset:將所有關注“是否發生異常”的檔案描述符註冊到fd_set型變數,並傳遞其地址值;

    -timeout:呼叫select函式後,為防止陷入無限阻塞的狀態,傳遞超時(time-out)資訊;

    返回值:發生錯誤時返回-1,超時返回時返回0。因發生關注的事件返回時,返回大於0的值,該值是發生事件的檔案描述符;

    第一,檔案描述符的監視範圍與select函式的第一個引數有關,每次新建檔案描述符時,其值都會增1;

    第二,select函式的超時時間與select函式的最後一個引數有關,其中,timeval結構體定義如下:

struct timeval
{
    long tv_sec; // seconds
    long tv_usec; // microsecond
};

    本來select函式只有在監視的檔案描述符發生變化時才返回。如果未發生變化,就會進入阻塞狀態。指定超時時間就是為了防止這種情況的發生。

4.       呼叫select函式後檢視結果

    select函式呼叫完成後,向其傳遞的fd_set變數中將發生變化。原來為1的所有位均變為0,但發生變化的檔案描述符對應位除外。

    呼叫select函式後,結構體timeval的成員tv_sec和tv_usec的值將被替換為超時前剩餘時間。

   




相關推薦

TCP/IP網路程式設計12 I/O

12.1 基於I/O複用的伺服器端1.       多程序伺服器端的缺點    為了構建併發伺服器,只要有客戶端連線請求就會建立新程序。這的確是實際作業系統中採用的一種方案,但並非十全十美,因為建立程序時需要大量的運算和記憶體空間,由於每個程序都具有獨立的記憶體空間,所以相互

TCP/IP網路程式設計》第一:理解網路程式設計和套接字 筆記

第一章:理解網路程式設計和套接字 本章程式碼,在TCP-IP-NetworkNote中可以找到。 1.1 理解網路程式設計和套接字 1.1.1構建打電話套接字 以電話機打電話的方式來理解套接字。 呼叫 socket 函式(安裝電話機)時進行的對話: 問:接

c++ 網絡編程(四)TCP/IP LINUX/windows下 socket 基於I/O的服務器端代碼 解決多進程服務端創建進程資源浪費問題

linux系統中 cin 通過 sel print 大小 查看 服務 集合 原文作者:aircraft 原文鏈接:https://www.cnblogs.com/DOMLX/p/9613861.html 好了,繼上一篇說到多進程服務端也是有缺點的,每創建一個

TCP/IP網路程式設計5 筆記&程式碼&註釋

在第四章中的回聲迭代客戶端中,客戶端通過write()一次性將字串傳送過去,之後呼叫read()等待接受自己傳輸的字串,因此這個回聲迭代客戶端是不完美的。 解決方法就是提前確定接受資料的大小: //Linux while(1) { //......相同省略 int str_l

TCP/IP網路程式設計4 筆記&程式碼&註釋

TCP TCP Transmission Control Protocol 傳輸控制協議,意為對資料傳輸過程的控制。 TCP/IP 協議棧 TCP/IP 協議棧分四層: 應用層 TCP層/UDP層 IP層 鏈路層 根據2.的TCP套接字還是UDP套接字

TCP/IP網路程式設計3 筆記&程式碼&註釋

IP(網路協議Internet Protocol):為了收發網路資料而給計算機分配的值。 埠號:為了區分程式中建立的套接字而分配給套接字的序號。 網路地址 IPv4 4位元組地址族(目前主要使用) IPv6 16位元組地址族(為了應對IP地址耗盡而提出的標準,但現在仍未普及)

TCP/IP網路程式設計2 筆記&程式碼&註釋

注:本章內容大部分為第一章的伺服器與客戶端程式碼的解析與理解,十分重要 協議 伺服器端和客戶端為了能進行資料交換,他們必須遵循同一個協議:    建立套接字 int socket(int domain, int type, int protocol)//Lin

TCP/IP網路程式設計1 筆記&程式碼&註釋

註釋筆記在程式碼內: 伺服器: //以下均在VS2015 WINDOWS平臺編譯並執行 //在Linux中 標頭檔案為: //#incude<sys/socket.h> //以下為服務端程式碼示例 #define _WINSOCK_DEPRECATED_NO_WARNINGS

TCP IP網路程式設計》尹聖雨----7.習題

(1)請說明TCP/IP的四層協議棧,並說明TCP和UDP套接字經過的層級結構差異。 TCP套接字:鏈路層,IP層,TCP層,應用層 UDP套接字:鏈路層,IP層,UDP層,應用層 (2)請說出TCP/IP協議棧中鏈路層和IP層的作用,並給出二者關係。 鏈路層:是物理連結

Java網路程式設計—— 非阻塞I/O

使用非阻塞IO方式實現chargen收發協議 客戶端 import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.ByteBuffer; imp

TCP/IP網路程式設計 課後題(一)第一

3)Linux中,對套接字資料進行I/O時可以直接使用檔案I/O的相關函式;而在Windows則不可以。原因? 答案:在Linux世界裡,socket也被認為是檔案的一種。而Windows與Linux不同,,是要區分socket和檔案的。 4)建立套

TCP/IP網路程式設計 學習筆記_13 --基於I/O的服務端

前言:前面我們講了多程序的併發服務端,只要有客服端連線請求就會建立新程序,這雖然也是一種解決方案,但建立程序是需要付出極大代價的,這需要大量運算和記憶體空間,而且每個程序間具有獨立的記憶體空間,所以相互間的資料交換也相對複雜(管道)。 本章將討論併發伺服器的第

淺談 TCP/IP 網路程式設計中 socket 的行為

來源:PromisE_謝  連結:www.cnblogs.com/promise6522/archive/2012/03/03/2377935.html 我認為,想要熟練掌握 Linux 下的 TCP/IP 網路程式設計,至少有三個層面的知識需要熟悉: TCP/IP

TCP/IP網路程式設計基礎閱讀筆記

TCP/IP網路程式設計基礎閱讀筆記 open函式 該函式開啟一個檔案(linux下任何皆檔案),返回檔案描述符,失敗返回-1 int open(const char* pathname,int flags,mode_t mode) flags:檔案開啟方式的標誌 O_RD

python-tcp/ip網路程式設計認識(四)

本文作者:黎智煊,叩丁狼高階講師。原創文章,轉載請註明出處。 udp的介紹 前面我們說了很多的知識都是關於tcp的知識點,但是,其實與tcp相對來說不同的還有就是也是非常重要的udp了. UDP --- 使用者資料報協議 是一個無連線的簡單的面向資料報的運

python-tcp/ip網路程式設計認識(三)

本文作者:黎智煊,叩丁狼高階講師。原創文章,轉載請註明出處。 socket簡介 介紹 socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆檔案”,對於檔案用【開啟】【讀寫】【關閉】模式來操作。socket就是該模式的一個實現,socket即是一種特殊的

TCP/IP網路程式設計之基於TCP的服務端/客戶端

理解TCP和UDP 根據資料傳輸方式的不同,基於網路協議的套接字一般分為TCP套接字和UDP套接字。因為TCP套接字是面向連線的,因此又稱為基於流(stream)的套接字。TCP是Transmission Control Protocol(傳輸控制協議)的簡寫,意為“對資料傳

python-tcp/ip網路程式設計-網路除錯助手的使用

本文作者:黎智煊,叩丁狼高階講師。原創文章,轉載請註明出處。 網路除錯助手的使用 俗話說,好馬配好鞍,今天我們來簡單認識一下幾個平臺的網路助手如何使用. 先說一下,假如不是用外部圖形化工具的情況下, 我們如何捕獲一些網路資料. 現在假設一下你正在使用基於

TCP/IP網路程式設計學習(一)

前言:學校開的課比價不合理,這學期才剛剛接觸計算機網路,可是本學期很多課卻又是以計算機網路為基礎的。沒辦法,只能先自己學習一些計算機網路方面的知識。學習這個網路程式設計主要是為了做我的一個程式設計的實驗

TCP/IP網路程式設計1

最近筆試面試都考到了TCP/IP方面的知識,在日益發展的物聯網時代,網路通訊是必不可少的知識。自己對這方面的知識不夠深入,故查詢資料整理如下,如有侵權請聯絡。 概述     網路程式設計實際上就是編寫程式使兩臺聯網的計算機相互的交換資料。作業系統會提供名為“ 套接字 ”