使用C語言在Liunx環境下作出簡易FTP伺服器

2021-10-25 14:39:14 字數 4512 閱讀 6770

*模仿linux自帶的ftp伺服器

什麼是ftp伺服器

ftp伺服器(file transfer protocol server)是在網際網路上提供檔案儲存和訪問服務的計算機,它們依照ftp協議提供服務。 ftp是file transfer protocol(檔案傳輸協議)。顧名思義,就是專門用來傳輸檔案的協議。簡單地說,支援ftp協議的伺服器就是ftp伺服器。

ftp伺服器的工作原理是什麼

既然我們想通過已有的ftp伺服器,自己進行簡單地模仿,那就得了解ftp伺服器它的大概的原理與步驟:

ftp伺服器執行ftp守護程序,等待使用者的ftp請求。

2.使用者執行ftp命令,請求ftp伺服器為其服務。

例:ftp 202.119.2.197

ftp守護程序收到使用者的ftp請求後,派生出子程序ftp與使用者程序ftp互動,建立檔案傳輸控制連線,使用tcp埠21。

使用者輸入ftp子命令,伺服器接收子命令,如果命令正確,雙方各派生乙個資料傳輸程序ftp-data,建立資料連線,使用tcp埠20,進行資料傳輸。

本次子命令的資料傳輸完,拆除資料連線,結束ftp-data程序。

使用者繼續輸入ftp子命令,重複4、5的過程,直至使用者輸入quit命令,雙方拆除控制連線,結束檔案傳輸,結束ftp程序。

想要用c語言完成乙個簡易的ftp伺服器,一定要有伺服器和客戶端這兩個介面,所要實現的操作無非就是伺服器和客戶端(即本地)的乙個互動以及本地的檔案操作。大致功能如下所示(***表示檔名):

伺服器:

獲取伺服器的檔案:get ***

展示伺服器中的檔案:ls ***

進入伺服器某個資料夾:cd ***

上傳檔案到伺服器:put ***

客戶端(即本地):

檢視客戶端本地檔案:lls ***

進入客戶端裡的資料夾:lcd ***

主要原理還是基於socket伺服器和客戶端的開發,以及呼叫相關的api。

伺服器(tcp server):

客戶端tcp client):

總體開發流程:

最後只要呼叫相關的api和新增上相應的功能**即可。

伺服器**:

int

get_cmd_type

(char

*cmd)

char

*getdesdir

(char

*cmsg)

void

msg_handler

(struct msg msg,

int fd)

;char

*file =

null

;int fdfile;

printf

("cmd:%s\n"

,msg.data)

;int ret =

get_cmd_type

(msg.data)

;switch

(ret)

else

break

;case put:

fdfile =

open

(getdesdir

(msg.data)

,o_rdwr | o_creat,

0666);

write

(fdfile,msg.secondbuf,

strlen

(msg.secondbuf));

close

(fdfile)

;break

;case quit:

printf

("客戶端退出!\n");

exit(-

1);}

}int

main

(int argc,

char

**ar**)

memset

(&s_addr,0,

sizeof

(struct sockaddr_in));

memset

(&c_addr,0,

sizeof

(struct sockaddr_in));

s_fd =

socket

(af_inet,sock_stream,0)

;if(s_fd ==-1

) s_addr.sin_family = af_inet;

s_addr.sin_port =

htons

(atoi

(ar**[2]

));inet_aton

(ar**[1]

,&s_addr.sin_addr)

;bind

(s_fd,

(struct sockaddr *

)&s_addr,

sizeof

(struct sockaddr_in));

listen

(s_fd,10)

;int clen =

sizeof

(struct sockaddr_in)

;while(1

)printf

("取得連線:%s\n"

,inet_ntoa

(c_addr.sin_addr));

if(fork()

==0)else

if(s_read >0)

}}}close

(c_fd)

;close

(s_fd)

;return0;

}

客戶端**:

char

*getdir

(char

*cmd)

intget_cmd_type

(char

*cmd)

intcmd_handler

(struct msg msg,

int fd)

else

break

;case lls:

system

("ls");

break

;case lcd:

dir =

getdir

(msg.data)

;chdir

(dir)

;break

;case quit:

strcpy

(msg.data,

"quit");

write

(fd,

&msg,

sizeof

(msg));

close

(fd)

;exit(-

1);}

return ret;

}void

handler_server_message

(int c_fd,

struct msg msg)

else

if(msgget.type == dofile)

else

}int

main

(int argc,

char

**ar**)

c_fd =

socket

(af_inet,sock_stream,0)

;if(c_fd ==-1

) c_addr.sin_family = af_inet;

c_addr.sin_port =

htons

(atoi

(ar**[2]

));inet_aton

(ar**[1]

,&c_addr.sin_addr)

;connect

(c_fd,

(struct sockaddr *

)&c_addr,

sizeof

(struct sockaddr))==

-1)printf

("連線中......\n");

int mark =0;

while(1

)continue;}

mark =1;

int ret =

cmd_handler

(msg,c_fd);if

(ret > ifgo)

if(ret ==-1

)handler_server_message

(c_fd,msg);}

return0;

}

最後別忘記配置你自己的標頭檔案哦!

做完專案之後,你可以通過命令

ftp 127.0.0.1

(或者通過config指令進行ip位址的檢視),來對比liunx自帶的ftp伺服器,你也可以新增你想到的功能,比如新增使用者名稱和密碼,新增多客戶端的接入等等,期待你的繼續發揮。

最後祝大家成功,同時也感謝陳立臣老師的細心指導!

在vscode中配置C語言環境

這個作業屬於哪個課程 2022物件導向程式設計 這個作業要求在 2022物件導向程式設計寒假作業1 這個作業的目標 選擇ide之後,請配置語言環境並在部落格中記錄過程,要求能 執行 c c 並截圖證明 作業正文 如下其他參考文獻 配置vscode c語言環境 在vscode的拓展中配置 以及複製下m...

Nginx在Liunx的安裝和使用

2,pcre perl compatible regular expressions 是乙個perl庫,包括 perl 相容的正規表示式庫。nginx 的 http 模組使用 pcre 來解析正規表示式,所以需要在 linux 上安裝 pcre 庫,pcre devel 是使用 pcre 開發的乙個...

liunx下python的虛擬環境使用

目錄 1 環境介紹 2 工具介紹 1 安裝到python3的包裡 2 環境變數配置 3 虛擬環境相關命令 專案依賴包一次性引入 專案環境解決import異常 liunx版本 python版本 我是py2和py3環境並存的 virtualenv虛機環境的第三方包pip3 install virtual...