MFC Socket实现Server和Client发送文件学习记录

本文记录了使用MFC Socket技术实现Server和Client之间文件发送的过程。客户端通过Dialog_sub.cpp处理Download选项,而Server端完成主要的文件接收任务。程序流程包括Server端界面与Client端的下载操作,附带了Client端DownLoad Option子窗体截图。
摘要由CSDN通过智能技术生成

1. CSelectFileClientDlg.cpp

void CSelectFileClientDlg::OnBnClickedButtonConnect()
{
	/********************** 判断用户输入 ***********************/
	CString variable_port ; 
	CString variable_ip ; 
	_ip_address.GetWindowText(variable_ip) ;
	_ip_address.GetAddress(ip) ; 
	_port.GetWindowText(variable_port) ; 
	//MessageBox(variable_port) ;
	//MessageBox(variable_ip) ; 
	ip = htonl(ip);
	if(ip == 0){
       MessageBox("请输入要连接的server ip!") ;
	   return ;
	}
    
	port = atoi(variable_port) ; 
	if(port == 0 ){
       MessageBox("请输入要链接的端口号!") ; 
	   return ;
	}
    
	if(!client_end.client_to_socket(ip,port))
	{
        MessageBox("socket()函数执行错误!") ; 
		exit(1);
	}
    
	if(!client_end.client_to_connect()){
		MessageBox("connect()函数执行错误!") ; 
		exit(1);
	}
    _message_list.InsertItem(count,"") ; 
	_message_list.SetItemText(count++,0,"Connection established at remote Server at:"+variable_ip+":"+variable_port) ;

}

void CSelectFileClientDlg::OnBnClickedButtonExit()
{
	OnOK();
}

void CSelectFileClientDlg::OnBnClickedButtonAbout()
{
    CString about ; 
	about.Append(_T("姓名:侯庆东\n"));
	about.Append(_T("学号:123520081203010\n")) ; 
	MessageBox(about) ;
}

void CSelectFileClientDlg::OnBnClickedButtonTrace()
{
	CString file_name ; 
	_file_name.GetWindowText(file_name) ; 

	file_name_public = file_name ;

	if(file_name==""){
		MessageBox("请求的文件名不能为空!") ; 
		return ; 
	}

	/******************** 开始构造第一个用于追踪的包 *********************/
	int file_name_length = file_name.GetLength() ; 
	char *Data=NULL ; 
	Data = (LPSTR)(LPCTSTR)file_name ; 
    MessagePacket myask ; 
	myask = Go_to_make_packet(TYPE_TRACE,FUTURE,12+file_name_length,0,0,Data,file_name_length) ;

	INT send_nums ; 
	char* buffer=NULL ;
/*	memcpy(buffer,(char*)&myask,1) ;
	memcpy(buffer+1,(char*)&myask,1) ;
	memcpy(buffer+2,(char*)&myask,2) ;
	memcpy(buffer+4,(char*)&myask,4) ;
	memcpy(buffer+8,(char*)&myask,4) ;
	memcpy(buffer+12,(char*)&myask,file_name_length) ;
*/
	if ((send_nums=client_end.client_to_send((char*)&myask,file_name_length+12))<0)
	{
		MessageBox("send()函数出错!") ; 
		exit(1) ; 
	}else{
		_message_list.InsertItem(count,"") ; 
		_message_list.SetItemText(count++,0,"Requesting file information on the server:"+file_name) ; 
	}
    
	if(!client_end.client_to_recv())
	{
		MessageBox("recv() file size 函数出错!") ;
		exit(1);
	}else{
		MessagePacket msg ;
		memcpy(&msg,client_end.recv_buffer,sizeof(msg)) ;
		unsigned int file_size ;
		file_size = msg.msgheader.Size ;
		file_size = file_size/1024 ;
		CString csfile_size ; 
		csfile_size.Format("%d",file_size) ;
		_message_list.InsertItem(count,"") ; 
		_message_list.SetItemText(count++,0,"Received the size from the server:"+csfile_size+"KB") ; 
		//memset(client_end.recv_buffer,'\0',sizeof(client_end.recv_buffer)) ;

	}
    

}

/******************** 构造发送包的函数 *************************/
MessagePacket CSelectFileClientDlg::Go_to_make_packet(char type,char future,unsigned short total_len, unsigned long position, unsigned int size, char *data ,INT data_len)
{
	MessagePacket new_packet ; 
	new_packet.msgheader.Type = type ; 
	new_packet.msgheader.Reserved = future ; 
	new_packet.msgheader.TotalLength = total_len ; 
	new_packet.msgheader.Position = position ; 
	new_packet.msgheader.Size = size ; 
	memcpy(new_packet.Data,data,data_len);
	return new_packet ;
}

void CSelectFileClientDlg::OnBnClickedButtonDownload()
{
    CDialog_sub dlgsub ;
	dlgsub.DoModal();
}

LRESULT CSelectFileClientDlg::Sub_Window_Process(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值