1. 程式人生 > >關於開源專案——C語言實現FTP伺服器的結構解析

關於開源專案——C語言實現FTP伺服器的結構解析

專案地址:https://github.com/beckysag/ftp

針對此開源專案的說明,結構分析。

 服務端整體框架:

1.     從命令列輸入得到服務端繫結埠號

2.     設定套介面選項,建立監聽套接字。

3.     用while迴圈 + fork實現子程序與客戶端的交流。

4.     父程序的交流套接字關閉,子程序的監聽套接字關閉。

在子程序與客戶端的交流中:

1.     傳送220歡迎應答碼。

2.     接收客戶端傳來的使用者名稱、密碼資訊,與檔案的內容相比對,如果有,則認證成功,傳送230應答碼;失敗傳送430應答碼,並退出。

3.     迴圈處理使用者的請求,接收客戶端傳來的命令,此專案提供如下命令的解析。接收到USER,PASS,LIST,RETR則傳送應答碼200,收到QUIT傳送應答碼221(),其他命令視為無效命令。

4.     如果應答碼為200,繼續處理。採用被動模式,客戶端建立監聽套接字等待服務端主動連線,建立資料連線,之前建立的是控制連線。

5.     如果接收到LIST命令,將當前目錄重定向到檔案中,在資料連線中傳送檔案中的內容,傳送成功後,在控制連線中傳送應答碼226,關閉資料連線;

如果接收到RETR命令,則開啟檔案,在資料連線中傳送檔案,傳送成功後,在控制連線中傳送應答碼226,關閉資料連線。

客戶端整體框架:

1.     從命令列輸入得到伺服器主機名和埠號。

2.     通過getaddrinfo得到期望的返回型別資訊的暗示,實現主機名和伺服器名轉換成套介面地址結構的功能,與服務端進行連線。

3.     輸入使用者名稱、密碼進行驗證。

4.     傳送命令到伺服器,接收伺服器返回應答碼,如接收到221,則退出;接收到502,則顯示不合法的輸入;接收到200,處理命令。

接收到200,開啟資料連線,客戶端建立監聽套接字,在之前的控制連線上傳送一個ACK確認,接收伺服器的連線,關掉監聽套接字。如果是LIST命令,先通過控制連線接收伺服器傳來的訊息,在通過資料連線打印出目錄,最後接收伺服器傳來完成的訊息,關閉資料連線。如果是RETR命令,開啟檔案失敗返回錯誤碼550,關閉資料連線進行下一個迴圈;檔案存在則通過資料連線寫入檔案,關閉資料連線。