1. 程式人生 > >2018-2019-1 20165220 《信息安全系統設計基礎》第八周學習總結

2018-2019-1 20165220 《信息安全系統設計基礎》第八周學習總結

自然 請求 path 並發服務器 應用程序 可用 總結 協議 name

教材知識點總結

1.並發程序有三種方法

a.線程:線程是運行在單一進程上下文中的邏輯流,由內核進行調度

b.進程:每個邏輯流都是一個進程,由內核來調度和維護。

c..I/O多路復用:在這種形式中,應用程序在一個進程的上下文中顯式地調度它們自己的邏輯流。邏輯流被模型化為狀態機。因為程序是一個單獨的進程,所以所有的流都共享同一個地址空間。

2.構造並發服務器的自然方法就是,在父進程中接受客戶端連接請求,然後創建一個新的子進程來為每個新客戶端提供服務。

3.因為父子進程中的已連接描述符都指向同一個文件表表項,所以父進程關閉它的已連接描述符的拷貝是至關重要的,而且由此引起的存儲器泄露將最終消耗盡可用的存儲器,使系統崩潰。

4.客戶端-服務器編程模型

a.一個應用是由一個服務器進程和一個或多個客戶端進程組成

b.服務器進程 -> 管理某種資源 -> 通過操作這種資源來為它的客戶端提供某種服務

5.全球IP因特網

a.TCP/IP協議族

b.因特網的客戶端和服務器混合使用套接字接口函數和UnixI/O函數進行通信

6.

每個網絡應用都是基於客戶端一服務器模型的。一個應用是由一個服務器進程和一個或者多個客戶端進程組成。服務器管理某種資源,並且通過操作這種資源來為它的客戶端提供某種服務。

客戶端一服務器模型中的基本操作是事務,一個客戶端-服務器由四步組成:

a.當一個客戶端需要服務時,它向服務器發送一個請求,發起一個事務。

b.服務器收到請求後,解釋它,並以適當的方式操作它的資源。

c.服務器給客戶端發送一個響應,並等待下一個請求。

d.客戶端收到響應並處理它。

技術分享圖片

技術分享圖片

7.

socket 函數

客戶端和服務器使用 socket 函數來創建一個套接字描述符

技術分享圖片

connect 函數

客戶端通過調用 connect 函數來建立和服務器的連接。

技術分享圖片

open_clientfd 函數

open_clientfd 函數和運行在主機 hostname 上的服務器建立一個連接,並在知名端口 port 上監聽連接請求。它返回一個打開的套接宇描述符,該描述符準備好了,可以用 Unix I/O 函數做輸入和輸出。

** bind 函數**

bind、 listen 和 accept 被服務器用來和客戶端建立連接。

技術分享圖片

加分項目——pwd的實現

首先通過man 命令了解了一下pwd的用法

技術分享圖片

技術分享圖片

相關代碼

#include<stdio.h>  
#include<sys/stat.h>  
#include<dirent.h>  
#include<stdlib.h>  
#include<string.h>  
#include<sys/types.h>  
void printpath();  
char *inode_to_name(int);  
int getinode(char *);  
int main()  
{  
    printpath();  
    putchar(\n);  
    return ;  
}  
void printpath()  
{  
    int inode,up_inode;  
    char *str;  
    inode = getinode(".");  
    up_inode = getinode("..");  
    chdir("..");  
    str = inode_to_name(inode);  
    if(inode == up_inode) {  
    //  printf("/%s",str);  
        return;  
    }  
    printpath();  
    printf("/%s",str);  
}  
int getinode(char *str)  
{  
    struct stat st;  
    if(stat(str,&st) == -1){  
        perror(str);  
        exit(-1);  
    }  
    return st.st_ino;  
}  
char *inode_to_name(int inode)  
{  
    char *str;  
    DIR *dirp;  
    struct dirent *dirt;  
    if((dirp = opendir(".")) == NULL){  
        perror(".");  
        exit(-1);  
    }  
    while((dirt = readdir(dirp)) != NULL)  
    {  
        if(dirt->d_ino == inode){  
            str = (char *)malloc(strlen(dirt->d_name)*sizeof(char));  
            strcpy(str,dirt->d_name);  
            return str;  
        }  
    }  
    perror(".");  
    exit(-1);  
}

運行結果:

技術分享圖片

總結:pwd命令的作用是查看當前所在的工作路徑。

2018-2019-1 20165220 《信息安全系統設計基礎》第八周學習總結