1. 程式人生 > >2018-2019-1 20165303 《資訊安全系統設計基礎》第八週學習總結

2018-2019-1 20165303 《資訊安全系統設計基礎》第八週學習總結

網路程式設計

  • 客戶端-伺服器程式設計模型
    一個應用是由一個伺服器程序和一個或者多個客戶端程序組成
    伺服器程序管理某種資源 ,並且通過操作這種資源來為它的客戶端提供某種服務
  • 網路
  • 一個網路主機的硬體組成

從網路上接收到的資料從介面卡經過I/O和儲存器匯流排複製到儲存器,通常是通過DMA(直接儲存器存取方式)傳送。
網路是一個按照地理遠近組成的層次系統:最低層是LAN(區域網),最流行的區域網技術是乙太網。

  • 橋接乙太網

  • 套接字介面
    1.socket()函式
    該函式用於根據指定的地址族、資料型別和協議來分配一個套接字的描述字及其所用的資源。Socket函式原型為:
    int socket( int domain , int type , int protocol ) ;
    a、 引數domain指定地址描述,一般為AP_INET;
    b、 引數type指定socket型別:SOCK_STREAM和SOCK_DGRAM;
    c、引數protocol通常為0;
    d、 函式返回值為一個整型socket描述符,在bind函式中呼叫。
    2.bind()函式
    該函式用於將一個本地地址與一個套接字繫結在一起。
    int bind( int sockfd , struct sockadd* my_addr , int addrlen) ;
    a、sockfd:socket描述符,使用socket函式返回值,將該socket與本機上的一個埠相關聯。
    在設計伺服器端程式是需要呼叫bind函式,以在該埠上監聽服務請求;而客戶端一般不需要呼叫bind函式,因為只需知道伺服器IP地址,並不關心客戶通過哪個埠與伺服器建立連線,核心會自動選擇一個未被佔用的埠供客戶端來使用。
    b、my_addr:指向包含本機IP地址及埠號等資訊的sockaddr型別的指標。
    c、addrlen:sizeof( struct sockaddr)的值。
    d、bind函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼。
    3.connect()函式
    與遠端伺服器建立一個TCP連線。
    int connect(int sockfd, struct sockaddr* serv_addr, int addrlen);
    a、sockfd:目的伺服器的socket描述符。
    b、serv_addr:指向包含目的伺服器的IP地址及埠號的指標。
    c、addrlen:sizeof( struct sockaddr)的值。
    d、connect函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,進行伺服器端程式設計時不需呼叫connect函式。
    4.listen()函式
    在伺服器端程式中,當socket與某一埠繫結後,需要監聽該埠,及時處理到達該埠上的服務請求。
    int listen(int sockfd, int backlog);
    a、sockfd:Socket系統呼叫返回的socket描述符。
    b、backlog:指定在請求佇列中允許的最大請求數,進入的連線請求將在佇列中等待接收backlog限制了佇列中等待服務的請求數目,系統預設值為20。
    c、listen函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼。
    5.accept()函式
    當某個客戶端試圖與伺服器監聽的埠連線時,該連線請求將排隊等待伺服器用accept接收它併為其建立一個連線。
    int accept(int sockfd, struct sockaddr* addr, int* addrlen);
    a、sockfd:被監聽的socket描述符。
    b、addr:sockaddr型別的指標變數,用來存放提出連線請求服務的主機資訊。
    c、accept函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,如果沒有錯誤,accept()函式返回一個新想socket描述符,供這個新連線來實用,而伺服器可以繼續在以前的socket上監聽,同時可以在新的socket描述符上進行資料傳送和資料接收(sent()和recv()操作)。
    6.sent()和recv()函式
    用於在面向連線(TCP)的socket上進行資料傳輸。
    send()函式原型:
    int send(int sockfd, const void* msg, int len, int flags) ;
    a、sockfd:用於傳輸資料的socket描述符。
    b、msg:是一個指向要傳送資料的指標。
    c、len:以位元組為單位的資料的長度。
    d、flags:一般情況下置為0。
    e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,否則返回所傳送資料的總數,該數字可能小於len中所規定的大小。
    recv()函式原型:
    int recv(int sockfd, void* buf, int len, unsigned int flags);
    a、sockfd:是接收資料的socket描述符。
    b、buf:是存放接收資料的緩衝區。
    c、len:以位元組為單位的緩衝區的長度。
    d、flags:一般情況下置為0。
    e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,無錯則返回讀入的位元組數,如果連線被中止,返回0。
    7.endto()和recvfrom()函式
    這兩個函式是利用資料報方式(UDP)進行資料傳輸。在無連線的資料報socket方式下,由於本地socket並沒有與遠端機器建立連線,所以在傳送資料時應指明目的地址。
    sendto()原型:
    int sendto(int sockfd, const void* msg, int len, unsigned int flags, const struct sockaddr* to, int tolen);
    a、sockfd:用於傳輸資料的socket描述符。
    b、msg:是一個指向要傳送資料的指標。
    c、len:以位元組為單位的資料的長度。
    d、flags:一般情況下置為0。
    e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,否則返回所傳送資料的總數,該數字可能小於len中所規定的大小。
    f、表示目的機器的IP地址和埠號。
    g、tolen:被賦值為sizeof(struct sockaddr)。
    recvfrom函式原型:
    int recv(int sockfd, void* buf, int len, unsigned int flags, struct sockaddr* from, int fromlen);
    a、sockfd:是接收資料的socket描述符。
    b、buf:是存放接收資料的緩衝區。
    c、len:以位元組為單位的緩衝區的長度。
    d、flags:一般情況下置為0。
    e、函式返回值:為-1表示遇到錯誤,並且errno中包含相應的錯誤碼,無錯則返回讀入的位元組數,如果連線被中止,返回0。
    f、from:儲存源機器的IP地址和埠號。
    g、fromlen:常被賦值為sizeof(struct sockaddr)。
    當對於資料報socket呼叫了connect()函式時,也可以用send()和recv()進行資料傳輸,但該socket仍然是資料報socket,並利用傳輸層的UDP服務。但是在傳送或接收資料報時,核心會自動為它加上目的地址和源地址資訊。
    8.close()和shutdown()函式
    當所有的資料操作結束後,可以呼叫close函式來釋放該socket資源,從而停止在該socket上的任何資料操作。
    也可以呼叫shutdown函式,允許只停止在某個方向上的資料傳輸,而另一個方向上的資料傳輸繼續進行。例如可以關閉某一個socket上的寫操作uo允許繼續在該socket上接收資料,直到讀入所有資料。
    但是,shutdown函式並不關閉套接字所佔用的所有資源,除非呼叫close函式來釋放。
    看看兩個函式原型:
    close(int sockfd);
    shutdown(int sockfd, int how);
    how引數的值和含義:
    0:不允許繼續接收資料;
    1:不允許繼續傳送資料;
    2:不允許繼續傳送和接收資料。
    shutdown在操作成功時返回0,錯誤時返回-1,並置errno值。
    9.位元組順序轉換函式
    htons():Host to Network Short的縮寫,該函式將主機的無符合短整型數字節順序轉換成網路位元組順序。
    htonl():Host to Network Long的縮寫,該函式將主機的無符合長整型數字節順序轉換成網路位元組順序。
    ntohs():Network to Host Short的縮寫,該函式將無符號短整型數從網路位元組順序轉換為主機位元組順序。
    ntohl():Network to Host long的縮寫,該函式將無符號長整型數從網路位元組順序轉換為主機位元組順序。
  • web伺服器
  • 伺服器和客戶端的實現

併發程式設計

  • 程序 執行緒 I/O多路複用

  • 基於程序的併發程式設計
    構造併發伺服器的自然方法就是,在父程序中接受客戶端連線請求,然後建立一個新的子程序來為每個新客戶端提供服務。

  • I/O多路複用
    select函式

  • 執行緒

執行緒:執行在程序上下文中的邏輯流。
執行緒有自己的執行緒上下文,包括一個唯一的整數執行緒ID、棧、棧指標、程式計數器、通用目的暫存器和條件碼。所有執行在一個程序裡的執行緒共享該程序的整個虛擬地址空間。
執行緒執行模型

  • posix執行緒
  • 建立執行緒
  • 終止執行緒
  • 回收資源
  • 分離執行緒
  • 初始化執行緒