來源:znzxc 發(fā)布時間:2018-11-21 15:22:44 閱讀量:1106
針對此開源項目的說明,結(jié)構(gòu)分析。
服務(wù)端整體框架:
1. 從命令行輸入得到服務(wù)端綁定端口號
2. 設(shè)置套接口選項,創(chuàng)建監(jiān)聽套接字。
3. 用while循環(huán) + fork實現(xiàn)子進(jìn)程與客戶端的交流。
4. 父進(jìn)程的交流套接字關(guān)閉,子進(jìn)程的監(jiān)聽套接字關(guān)閉。
在子進(jìn)程與客戶端的交流中:
1. 發(fā)送220歡迎應(yīng)答碼。
2. 接收客戶端傳來的用戶名、密碼信息,與文件的內(nèi)容相比對,如果有,則認(rèn)證成功,發(fā)送230應(yīng)答碼;失敗發(fā)送430應(yīng)答碼,并退出。
3. 循環(huán)處理用戶的請求,接收客戶端傳來的命令,此項目提供如下命令的解析。接收到USER,PASS,LIST,RETR則發(fā)送應(yīng)答碼200,收到QUIT發(fā)送應(yīng)答碼221(),其他命令視為無效命令。
4. 如果應(yīng)答碼為200,繼續(xù)處理。采用被動模式,客戶端創(chuàng)建監(jiān)聽套接字等待服務(wù)端主動連接,建立數(shù)據(jù)連接,之前建立的是控制連接。
5. 如果接收到LIST命令,將當(dāng)前目錄重定向到文件中,在數(shù)據(jù)連接中發(fā)送文件中的內(nèi)容,發(fā)送成功后,在控制連接中發(fā)送應(yīng)答碼226,關(guān)閉數(shù)據(jù)連接;
如果接收到RETR命令,則打開文件,在數(shù)據(jù)連接中傳送文件,發(fā)送成功后,在控制連接中發(fā)送應(yīng)答碼226,關(guān)閉數(shù)據(jù)連接。
客戶端整體框架:
1. 從命令行輸入得到服務(wù)器主機(jī)名和端口號。
2. 通過getaddrinfo得到期望的返回類型信息的暗示,實現(xiàn)主機(jī)名和服務(wù)器名轉(zhuǎn)換成套接口地址結(jié)構(gòu)的功能,與服務(wù)端進(jìn)行連接。
3. 輸入用戶名、密碼進(jìn)行驗證。
4. 發(fā)送命令到服務(wù)器,接收服務(wù)器返回應(yīng)答碼,如接收到221,則退出;接收到502,則顯示不合法的輸入;接收到200,處理命令。
接收到200,打開數(shù)據(jù)連接,客戶端創(chuàng)建監(jiān)聽套接字,在之前的控制連接上發(fā)送一個ACK確認(rèn),接收服務(wù)器的連接,關(guān)掉監(jiān)聽套接字。如果是LIST命令,先通過控制連接接收服務(wù)器傳來的消息,在通過數(shù)據(jù)連接打印出目錄,最后接收服務(wù)器傳來完成的消息,關(guān)閉數(shù)據(jù)連接。如果是RETR命令,打開文件失敗返回錯誤碼550,關(guān)閉數(shù)據(jù)連接進(jìn)行下一個循環(huán);文件存在則通過數(shù)據(jù)連接寫入文件,關(guān)閉數(shù)據(jù)連接。
---------------------