專案功能(四) 實現FTP兩種傳輸模式

2021-09-26 09:06:39 字數 3267 閱讀 6095

static void do_port(session_t *sess)

1、若選擇port模式進行連線,則會傳送字段:port 192,168,1,1,231,6,對該字段進行處理

2、建立乙個無符號整型陣列,陣列前兩個元素存埠號,後四個元素存ip位址

3、借助sscanf函式,對引數進行處理,將其格式化到陣列中去

4、給結構體中的port_addr開闢空間

5、使用memset函式對位址空間進行初始化

6、設定sin_family為af_inet,表示使用 ipv4 進行通訊

7、將埠號儲存到sin_port中

8、將ip位址儲存到sin_addr中

9、返回給客戶端200響應:ftp_portok

//判斷port模式是否啟用

int port_active(session_t *sess)

return 1;

} return 0;

}int pasv_active(session_t *sess)

//資料連線的建立(分主動模式和被動模式)

int get_transfer_fd(session_t *sess)

int ret = 1;

//如果是主動模式

if(port_active(sess))

else

}//如果是被動模式

if(sess->port_addr)

return ret;

}//傳輸列表

static void do_list(session_t *sess)

// 伺服器給客戶端150應答,表示可以進行列表的傳輸了

ftp_reply(sess, ftp_dataconn, "here comes the directory listing.");

// 傳輸列表,會建立乙個資料套接字

list_common(sess, 1);

// 一定要關閉資料套接字,不然客戶端會一直阻塞,因為得不到通知,一直讀取資料套接字內容,會處於死迴圈,直至伺服器關閉套接字,返回0

close(sess->data_fd);

//列表傳輸完,將資料套接字置為-1

sess->data_fd = -1;

// 伺服器給客戶端乙個226應答,表示列表傳輸完畢

//判斷被動模式是否啟用

int pasv_active(session_t *sess)

return 1;

} return 0;

}//被動模式pasv

static void do_pasv(session_t *sess)

; //獲取本地ip位址

getlocalip(ip);

sess->pasv_listen_fd = tcp_server(ip, 0);

struct sockaddr_in addr;

socklen_t addrlen = sizeof(addr);

if(getsockname(sess->pasv_listen_fd, (struct sockaddr *)&addr, &addrlen) <0)

//priv_sock_send_cmd(sess->child_fd, priv_sock_pasv_listen);

unsigned short port = (int)priv_sock_get_int(sess->child_fd);

//將ip存到陣列裡

unsigned int v[4];

sscanf(ip, "%u.%u.%u.%u", &v[0], &v[1], &v[2], &v[3]);

char text[1024] = ;

//port >> 8,獲取低八位,port & 0xff獲取高八位,存放在陣列裡

sprintf(text, "entering passive mode (%u,%u,%u,%u,%u,%u).",

v[0], v[1], v[2], v[3], port >> 8, port & 0xff);

ftp_reply(sess, ftp_pasvok, text);

}

//判斷port模式是否啟用

int port_active(session_t *sess)

return 1;

} return 0;

}//判斷被動模式是否啟用

int pasv_active(session_t *sess)

return 1;

} return 0;

}//資料連線的建立(分主動模式和被動模式)

int get_transfer_fd(session_t *sess)

int ret = 1;

//如果是主動模式

if(port_active(sess))

else

}//如果是被動模式啟用

if(pasv_active(sess))

sess->data_fd = fd;

} //如果是被動模式

if(sess->port_addr)

return 1;

}//傳輸列表

static void do_list(session_t *sess)

// 伺服器給客戶端150應答,表示可以進行列表的傳輸了

ftp_reply(sess, ftp_dataconn, "here comes the directory listing.");

// 傳輸列表,會建立乙個資料套接字

list_common(sess, 1);

// 一定要關閉資料套接字,不然客戶端會一直阻塞,因為得不到通知,一直讀取資料套接字內容,會處於死迴圈,直至伺服器關閉套接字,返回0

close(sess->data_fd);

//列表傳輸完,將資料套接字置為-1

sess->data_fd = -1;

// 伺服器給客戶端乙個226應答,表示列表傳輸完畢

ftp_reply(sess, ftp_transferok, "directory send ok.");

}

FTP傳輸兩種方式

for ftpfile ff fsname 分析對方公司,估計是改變了傳輸方式,將ftp伺服器改為了linux後採用了二進位制上傳,因此出現了這種問題。ftp協議的任務是從一台計算機將檔案傳送到另一台計算機,它與這兩台計算機所處的位置 聯接的方式 甚至是是否使用相同的作業系統無關。假設兩台計算機通過...

FTP兩種傳輸模式小結

ftp是有兩種傳輸的模式的,主動模式和被動模式,之前一直沒怎麼去搞明白之,現在找了下資料,乙個完整的ftp檔案傳輸需要建立兩種型別的連線,一種為檔案傳輸下命令,稱為控制連線,另一種實現真正的檔案傳輸,稱為資料連線。ftp控制連線建立之後,即可開始傳輸檔案,傳輸檔案的連線稱為ftp資料連線。ftp資料...

FTP兩種傳輸模式小結

ftp是有兩種傳輸的模式的,主動模式和被動模式,之前一直沒怎麼去搞明白之,現在找了下資料,乙個完整的ftp檔案傳輸需要建立兩種型別的連線,一種為檔案傳輸下命令,稱為控制連線,另一種實現真正的檔案傳輸,稱為資料連線。ftp控制連線建立之後,即可開始傳輸檔案,傳輸檔案的連線稱為ftp資料連線。ftp資料...