日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二)

發布時間:2024/1/1 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Socket 客戶端編程主要步驟如下:

1、socket() 創建一個 Socket

2、connect() 與服務器連接

3、write() 和 read() 進行會話

4、close() 關閉 Socket

Socket 服務器端編程主要步驟如下:

socket() 創建一個 Socket

bind()

listen() 監聽

accept() 接收連接的請求

write() 和 read() 進行會話

close() 關閉 Socket

1、客戶端和 FTP 服務器建立 Socket 連接。

2、向服務器發送 USER、PASS 命令登錄 FTP 服務器。

3、使用 PASV 命令得到服務器監聽的端口號,建立數據連接。

4、使用 RETR/STOR 命令下載/上傳文件。

5、在下載完畢后斷開數據連接并發送 QUIT 命令退出。

當客戶端與服務器建立連接后,服務器會返回 220 的響應碼和一些歡迎信息。

struct hostent *hp;

struct sockaddr_in server;

memset(&server, 0, sizeof(struct sockaddr_in));/* 初始化socket */

control_sock = socket(AF_INET, SOCK_STREAM, 0);

hp = gethostbyname(server_name);

memcpy(&server.sin_addr,

hp->h_addr, hp->h_length);

server.sin_family = AF_INET;

server.sin_port = htons(port);

/* 連接到服務器端 */

connect(control_sock,(struct sockaddr *)&server, sizeof(server));

/* 客戶端接收服務器端的一些歡迎信息 */

read(control_sock, read_buf, read_len);

當客戶端發送用戶名和密碼,服務器驗證通過后,會返回 230 的響應碼。然后客戶端就可以向服務器端發送命令了。

圖 2. 客戶端登錄 FTP 服務器

清單 2. 客戶端發送用戶名和密碼,登入 FTP 服務器

/* 命令 ”USER username\r\n” */

sprintf(send_buf,"USER %s\r\n",username);/*客戶端發送用戶名到服務器端 */

write(control_sock, send_buf, strlen(send_buf))

;/* 客戶端接收服務器的響應碼和信息,正常為 ”331 User name okay, need password.” */

read(control_sock, read_buf, read_len);

/* 命令 ”PASS password\r\n” */

sprintf(send_buf,"PASS %s\r\n",password);

/* 客戶端發送密碼到服務器端 */

write(control_sock, send_buf, strlen(send_buf));

/* 客戶端接收服務器的響應碼和信息,正常為 ”230 User logged in, proceed.”*/

read(control_sock, read_buf, read_len);

當客戶端在下載/上傳文件前,要先發送命令讓服務器進入被動模式。服務器會打開數據端口并監聽。并返回響應碼 227 和數據連接的端口號。

sprintf(send_buf,"PASV\r\n");

/* 客戶端告訴服務器用被動模式 */

write(control_sock, send_buf, strlen(send_buf));

/*客戶端接收服務器的響應碼和新開的端口號,* 正常為 ”227 Entering passive mode (

)” */

read(control_sock, read_buf, read_len);

當客戶端發送命令下載文件。服務器會返回響應碼 150,并向數據連接發送文件內容。

當客戶端下載完畢后,發送命令退出服務器,并關閉連接。服務器會返回響應碼 200。

首先,服務器準備就緒后返回 220。客戶端接收到服務器端返回的響應碼后,相繼發送“USER username” 和 “PASS password” 命令登錄。隨后,服務器返回的響應碼為 230 開頭,說明客戶端已經登入了。這時,客戶端發送 PASV 命令讓服務器進入被動模式。服務器返回如 “227 Entering Passive Mode (127,0,0,1,13,67)”,客戶端從中得到端口號,然后連接到服務器的數據端口。接下來,客戶端發送下載命令,服務器會返回響應碼 150,并從數據端口發送數據。最后,服務器返回 “226 transfer complete”,表明數據傳輸完成。

需要注意的是,客戶端不要一次發送多條命令,例如我們要打開一個目錄并且顯示這個目錄,我們得發送 CWD dirname,PASV,LIST。在發送完 CWD dirname 之后等待響應代碼,然后再發送后面一條。當 PASV 返回之后,我們打開另一個 Socket 連接到相關端口上。然后發送 LIST,返回 125 之后在開始接收數據,最后返回 226 表明完成。

在傳輸多個文件的過程中,需要注意的是每次新的傳輸都必須重新使用 PASV 獲取新的端口號,接收完數據后應該關閉該數據連接,這樣服務器才會返回一個 2XX 成功的響應。然后客戶端可以繼續下一個文件的傳輸。

上傳文件與下載文件相比,登入驗證和切換被動模式都如出一轍,只需要改變發送到服務器端的命令,并通過數據連接發送文件內容。

總結

以上是生活随笔為你收集整理的socket ftp android,使用 Socket 通信实现 FTP 客户端程序(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。