*模仿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...