(P12)miniftpd專案實戰12:內部程式間通訊模組設計

簡單生活,簡單愛發表於2020-11-10

1.內部程式間通訊模組設計

  • 具體內容,請看第3章系統設計中:3.5內部程式間通訊模組設計

  • 其他補充說明,為什麼要這樣做?接著上一節的寫好的程式碼
    當前nobody程式與jjl程式之間沒有通訊,當jjl程式結束的時候,nobody程式沒有辦法結束
    在這裡插入圖片描述
    現在將客戶端斷開,那麼會話就沒有存在的價值,按道理nobody程式和ftp服務程式jjl都不應該存在
    在這裡插入圖片描述
    但是卻發現ftp程式處於僵死的狀態,nobody程式沒有結束
    在這裡插入圖片描述

  • // FTP服務程式向nobody程式請求的命令

#define PRIV_SOCK_GET_DATA_SOCK 1,獲取主動模式資料連線socket
ftp服務程式不能直接建立資料連線通道,應該讓nobody程式來完成這個任務。

步驟如下:
FTP服務程式接收PORT h1,h2,h3,h4,p1,p2;
FTP服務程式要解析出客戶端的ip,port

FTP服務程式向nobody程式傳送一個PRIV_SOCK_GET_DATA_SOCK命令,讓他來完成建立資料連線通道的任務;
FTP服務程式還要向nobody程式傳送一個整數port 傳送4個位元組(雖然port是2個位元組)
FTP服務程式還要向nobody程式傳送一個字串ip 長度不定長

nobody程式接收PRIV_SOCK_GET_DATA_SOCK 這條命令建立一個主動模式的socket,
還要進一步接收一個整數,即port
還要進一步接收一個字串,即ip
操作為:
建立一個fd = socket,bind(20埠號),connect(客戶端的ip和port)
連線建立完畢後,需要給客戶端一個應答,成功給一個OK應答,如果是成功應答,還需要通多send_fd方法將該fd傳送給ftp服務程式

-// nobody程式對FTP服務程式的應答

#define PRIV_SOCK_RESULT_OK 1
如果是成功應答,還可能有進一步的資料傳輸,成功應答後,還要將fd傳遞給ftp服務程式(因為nobody程式會獲取資料socket,該socket要給ftp服務程式)

  • eg:
    miniftpd12\privsock.h
    miniftpd12\privsock.c
    miniftpd12\ftpproto.c
static void do_port(session_t *sess)需要改,目前還沒改

miniftpd12\main.c

signal(SIGCHLD, SIG_IGN);//避免殭屍程式

miniftpd12\privparent.c

// 解析內部命令
// 處理內部命令
static void privop_pasv_get_data_sock(session_t *sess)
static void privop_pasv_active(session_t *sess)
static void privop_pasv_listen(session_t *sess)
static void privop_pasv_accept(session_t *sess)

其他檔案變化不大

  • 測試:
    為什麼nobody程式跟著結束了?
    首先客戶端斷開了連線,ftp服務程式readline返回為0,那麼ftp服務程式也就跟著結束了,一旦其關閉,那麼就會關閉相關的socketpair socket,那麼nobody程式就會處於priv_sock_get_cmd的狀態,一旦對方的socketpair socket關閉了,這邊priv_sock_get_cmd會返回0,表示對方關閉,那麼if (ret != sizeof(res))就會成立,所以nobody程式也會退出了
    首先開啟一個client,接著關閉client
    在這裡插入圖片描述
    服務端的狀態
    在這裡插入圖片描述
    在這裡插入圖片描述

相關文章