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資料...