使用SOCKET实现FTP的简易客户端

2015-01-17 20:00:57|?次阅读|上传:wustguangh【已有?条评论】发表评论

关键词:C/C++, 网络通信|来源:唯设编程网

6. 保存日志文件

//保存日志文件
void CFTP::save_log( const char* str_log, FILE* pLogFile )
{	
	//格式化当前系统时间
	time_t nowtime = time(NULL); //获取当前时间
	struct tm *local = localtime(&nowtime);  //获取当前系统时间
	char tmp[2048] = {0};
	sprintf_s(tmp,"【%d-%d-%d %d:%d:%d】 %s",local->tm_year+1900,
		local->tm_mon+1,
		local->tm_mday,
		local->tm_hour,
		local->tm_min,
		local->tm_sec,
		str_log); 
	//连接字符串
	//strLog
	fwrite(tmp,strlen(tmp),1,pLogFile);
}

这段代码将参数str_log对应的字符串保存到日志文件中,并且以当前系统时间作为前缀。

7. 向FTP服务器发送命令

//向FTP服务器发送命令,
//buf_recv:接受返回内容的缓存区
//buf_length:缓存区长度
int CFTP::ftp_sendcmd( const char* p_cmd,char* buf_recv,size_t buf_length )
{ 
	int errCode = -1;
	//1.发送命令
	save_log(p_cmd, m_pLogFile);//应该保存ftp运行日志	
	int ret = send(m_sockctrl,p_cmd,strlen(p_cmd),0); 
	if(-1 == ret){
		errCode = WSAGetLastError();
		return -1;
	}
	//2.返回内容
	memset(buf_recv,'',buf_length);	
	int len = recv(m_sockctrl,buf_recv,buf_length,0);

	//接收残余数据
	char tmp[1024] = {0};

	while(len != SOCKET_ERROR && len != 0){
		len = recv(m_sockctrl,tmp,sizeof(tmp),0);
		if(len != SOCKET_ERROR && len != 0){
			strcat(buf_recv,tmp);
			memset(tmp,0,sizeof(tmp));
		}
	}
	save_log(buf_recv, m_pLogFile);//应该保存ftp运行日志 	
	return 0; 
} 

这段代码用来向FTP服务器发送命令,并将返回字符串存储在buf_recv对应的缓存区中,缓存区的长度通过buf_length参数指定。

8. 登录FTP服务器

//登录FTP服务器
int CFTP::ftp_login( const char* user,const char* pass )
{ 	
	//1.用户名
	sprintf_s(m_cmd,"USER %s
",user); 	
	int err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp)); 
	if(err)
		return -1;
	//得到返回码
	int code = get_state_code(m_resp);
	//331 Password required for usernaem.
	if(code != 331)
		return -1;	
	//2.密码
	sprintf_s(m_cmd,"PASS %s
",pass); 
	err = ftp_sendcmd(m_cmd,m_resp,sizeof(m_resp)); 
	if(err)
		return -1;
	//得到返回码
	code = get_state_code(m_resp);
	//230 User logged in.
	if(code != 230)
		return -1;	
	return 0; 
} 

这个函数用来登录FTP服务器,用户名和密码通过参数user和pass指定。

发表评论0条 】
网友评论(共?条评论)..
使用SOCKET实现FTP的简易客户端