資源簡介
Linux下的ftp實現方法,可以連接遠程服務器,實現下載上傳
代碼片段和文件信息
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
//#include?
#include?
#include?
#include?
#define?DEFAULT_FTP_PORT?21
extern?int?h_errno;
char?user[64];?//ftp?usr
char?passwd[64];?//ftp?passwd
//ftp?server?address
//記錄端口號IP地址
struct?sockaddr_in?ftp_server?local_host;//FTP服務器?本地主機
//該結構記錄主機的信息,包括主機名、別名、地址類型、地址長度和地址列表。
struct?hostent?*?server_hostent;//該結構記錄主機的信息
int?sock_control;
//ftp?mode?0?is?PORT(主動模式)?1?is?PASV(被動模式);
int?mode?=?1;?
//echo_off?and?echo_on?for?get?usr?password?from?stdin
//echo_off和echo_on從標準輸入獲得用戶名和密碼。
static?struct?termios?stored_settings;
void?echo_off(void)
{
????struct?termios?new_settings;
????tcgetattr(0&stored_settings);
????new_settings?=?stored_settings;
????new_settings.c_lflag?&=?(~ECHO);
????tcsetattr(0TCSANOW&new_settings);
????return;
}
void?echo_on(void)
{
????tcsetattr(0TCSANOW&stored_settings);
????return;
}
//命令錯誤退出
void?cmd_err_exit(char?*?err_msg?int?err_code)
{
printf(“%s\n“?err_msg);
exit(err_code);
}
/*************************************************/
//函數功能:向結構體中添加IP地址與端口號
//函數參數:IP地址,結構體,端口號
/*************************************************/
int?fill_host_addr(char?*?host_ip_addr?struct?sockaddr_in?*?host?int?port)
{
//如果端口號小于或等于0??或者大于65535
if(port?<=?0?||?port?>?65535)?
return?254;
//將結構體清零
bzero(host?sizeof(struct?sockaddr_in));
//設置為?IPv4?網絡協議的套接字類型
host->sin_family?=?AF_INET;
//如果正確執行將返回一個無符號長整數型數。
//如果傳入的字符串不是一個合法的IP地址,將返回INADDR_NONE。
????if(inet_addr(host_ip_addr)?!=?-1)
{
//將地址保存到結構體中
????????host->sin_addr.s_addr?=?inet_addr(host_ip_addr);
}
????else?
{
//返回對應于給定主機名的包含主機名字和地址信息的hostent結構的指針。
if((server_hostent?=?gethostbyname(host_ip_addr))?!=?0)
{
//將地址放在結構體中
memcpy(&host->sin_addr?server_hostent->h_addr\
????????sizeof(host->sin_addr));
}
????????else?return?253;
}
//將端口號保存在結構體中
????host->sin_port?=?htons(port);
return?1;
}
/*************************************************/
//函數功能:創建socket并連接,設置收發時間,
//函數參數:IP地址端口號結構體,收發時間設置(1?!1?3秒)
//?返回值?:配置好的Socket
/*************************************************/
int?xconnect(struct?sockaddr_in?*s_addr?int?type)
{
struct?timeval?outtime;
int?set;
//SOCK_STREAM:?提供面向連接的穩定數據傳輸,即TCP協議。
//創建scoket
int?s?=?socket(AF_INET?SOCK_STREAM?0);
if(s?0)
cmd_err_exit(“creat?socket?error!“?249);
//為控制設定時間?socket
//set?outtime?for?the?control?socket
if(type?==?1)
{
outtime.tv_sec?=?0;
outtime.tv_usec?=?300000;
}
else
{
outtime.tv_sec?=?5;
outtime.tv_usec?=?0;
}
//設置socket收發時限。
set?=?setsockopt(s?SOL_SOCKETSO_RCVTIMEO?&outtimesizeof(outtime));
if(set?!=0)
{
//失敗輸出錯誤原因。
printf
評論
共有 條評論