1. 程式人生 > >FTP伺服器和客戶端原始碼編寫問題(ftp server client source)

FTP伺服器和客戶端原始碼編寫問題(ftp server client source)

其實FTP也就是普通的Socket程式,只是需要按照FTP協議(RFC959, 1635?可能我記錯了)去做,也就是每個訊息有固定的結構的,比如頭3個位元組必須是200,201,300,400之類的數字表示操作結果。

寫FTP協議的程式主要要明白的一個關鍵問題是雙socket,一個control socket,一個是data socket,當然,你讀原始碼還可能發現一個passive socket:

control socket是用來在Client和Server之間傳遞命令的(Client<->Server:21):比如Client向Server的21埠發一個USER命令,即發使用者名稱和密碼給Server,再比如Client發LIST命令給Server,都是要用control socket傳遞命令並接收命令操作結果的。
data socket是用來在Client和Server之間傳遞資料的(Client<->Server:20):比如Client傳送一個LIST命令給Server之後,如果執行成功,這個成功訊息的返回要由上面的control socket返回給Client,但LIST得到的那些資料就要由data socket來傳遞,也只有在收到這個成功的訊息之後,Client才會連線Server的20埠去接收資料。
另外有passive socket,是一種data socket,是反向連線的,即Server發了LIST命令操作成功的訊息給Client之後,Client會告訴Server一個埠(比如3000),Server才會連線Client的3000埠,把LIST得到的資料傳送給Client。

我發現了一些FTP的原始碼,C的:
FTP Server:
http://www.opensource.apple.com/darwinsource/Current/lukemftpd-17/

FTP Client:http://www.opensource.apple.com/darwinsource/Current/lukemftp-5/
當然,你也可以去看看OpenBSD提供的FTP server原始碼:
http://www.openbsd.org/cgi-bin/cvsweb/src/libexec/ftpd/
或者你去看看有名的Berkeley上面的各種各樣 FTP server的原始碼吧:
http://www.googlesyndicatedsearch.com/u/berkeley?q=ftp+server&sitesearch=berkeley.edu&domains=berkeley.edu

還sf.net上提供的各種ftp原始碼:
http://sourceforge.net/search/index.php面頁上第一欄"with all of the words"裡填入ftp搜尋吧,各種原始碼都有,各種出名的FTP也都在上面了。