C++实现的FTP案例代码解析

2016-01-05 19:46:22|?次阅读|上传:wustguangh【已有?条评论】发表评论

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

5. 向FPT服务器发送命令

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; 
} 

函数接收三个参数,分别是:p_cmd:字符串表示的命令、buf_recv:接受返回内容的缓存区、buf_length:缓存区长度,同样,使用send发送命令,使用recv接收返回的内容。

6. 与服务器建立连接

int CFTP::ftp_connect(int timeout) 
{ 
	m_sockctrl = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 

	//设置超时	
	if (setsockopt(m_sockctrl,SOL_SOCKET,SO_RCVTIMEO, 
		(const char*) &timeout,sizeof(timeout)) == -1) 
	{ 
		perror("setsockopt"); 
		closesocket(m_sockctrl); 
		return -1; 
	} 	

	if(0==m_sockctrl)
		return -1; 
	struct sockaddr_in addr; 
	addr.sin_family = AF_INET; 
	addr.sin_port = htons(21); 
	addr.sin_addr.s_addr = inet_addr(m_ip); 
	int err = connect(m_sockctrl,(sockaddr*)&addr,sizeof(addr)); 
	if(err)
		return -1; 
	//220 Microsoft FTP Service
	err = recv_buf(m_resp,sizeof(m_resp)); 
	if(err || get_state_code(m_resp) != 220)
		return -1;
	
	return 0; 
}

通过connect函数与ftp服务器建立连接,根据返回状态码判断连接是否成功建立。

发表评论0条 】
网友评论(共?条评论)..
C++实现的FTP案例代码解析