(P12)miniftpd專案實戰12:內部程式間通訊模組設計
文章目錄
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
服務端的狀態
相關文章
- Electron實戰之程式間通訊
- Flink內部之間的通訊
- 內部伺服器之間介面通訊伺服器
- Rust程式設計與專案實戰-結構體Rust程式設計結構體
- 打造全網最全電商實戰專案系列教程[商品功能模組資料庫設計]資料庫
- 與你探索classnames模組內部實現
- Rust 程式設計視訊教程對應講解內容-包、crate、模組Rust程式設計
- kubernetes實踐之十八:叢集各模組之間的通訊
- Linux環境程式設計程式間通訊機制理解Linux程式設計
- 「小程式JAVA實戰」 小程式抽離公用方法進行模組化(12)Java
- 實驗八 程式間通訊
- Android元件化專題 - 路由框架進階模組間的業務通訊Android元件化路由框架
- Linux系統程式設計之程式間通訊方式:訊息佇列Linux程式設計佇列
- Python專案實戰(一)《Python程式設計 從入門到實踐》Python程式設計
- Linux系統程式設計之程式間通訊方式:管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:管道(一)Linux程式設計
- linux環境程式設計(2): 使用pipe完成程式間通訊Linux程式設計
- JS模組化程式設計JS程式設計
- javascript 模組化程式設計JavaScript程式設計
- 管理 ES 叢集:叢集內部間的安全通訊
- 2019黑馬程式設計師vue.js專案實戰全套程式設計師Vue.js
- Python專案實戰:20行程式設計迷宮大陣Python行程程式設計
- [MAUI 專案實戰] 筆記App(一):介紹與程式設計UI筆記APP程式設計
- 布匹瑕疵檢測專案之計米器模組的設計
- 通過 App Groups 實現程式間通訊APP
- 《程式設計時間簡史系列》JavaScript 模組化的歷史程式程式設計JavaScript
- QT QML模組的程式設計挑戰與解決方案QT程式設計
- 從0到1實現一個模組間通訊的服務元件元件
- Linux系統程式設計之程式間通訊方式:命名管道(二)Linux程式設計
- Linux系統程式設計之程式間通訊方式:命名管道(一)Linux程式設計
- linux環境程式設計(3): 使用POSIX IPC完成程式間通訊Linux程式設計
- Android 元件化之通訊(多模組,多程式)Android元件化
- 用函式實現模組化程式設計二函式程式設計
- 用函式實現模組化程式設計三函式程式設計
- 用函式實現模組化程式設計一函式程式設計
- iOS實現XMPP通訊(二)XMPP程式設計iOS程式設計
- ssts-hospital-web-master專案實戰記錄三十一:專案遷移-核心模組實現(useDeviceDriver)WebASTdev
- ssts-hospital-web-master專案實戰記錄三十二:專案遷移-核心模組實現(useFlow)WebAST