ctrldlg.cpp

来自「网络文件传输,用于显示屏控制系统」· C++ 代码 · 共 2,181 行 · 第 1/5 页

CPP
2,181
字号
 	int len = sizeof(sockaddr); 
  	while(1)
	{
		rec_len=recvfrom(my_udp_sock,(char *)rec_dat, 1600, 0,(LPSOCKADDR)&udp_recv_addr, &len);  
	 // rec_len=recvfrom(my_udp_sock,rec_udp_dat, 1600, MSG_DONTROUTE,(LPSOCKADDR)&udp_recv_addr, &len);
     // rec_len=recvfrom(my_udp_sock,rec_udp_dat, 1600, 0,NULL, NULL);
	  if(rec_len==SOCKET_ERROR)
	  {
		  AfxMessageBox("recbfrom err !");
		  return 1;
		 // WSACleanup();
	  }
	  else
	  {		           
		  if((rec_dat[0]==0xaa)&&(rec_dat[1]==0x55))
		  {				   
			   if(rec_dat[2]==con_syn_udp)//  接收到 UDP请求 应答  
			   {				   
				    re_udp_pack_sta=re_sta;	
					stru_file *prof=(stru_file *)rec_dat;					
				   if(flag_udp==star)
				   {                     
					   
					   flag_udp=f_connet;					 
				   }
			   }			    
			   else if(rec_dat[2]==com_ack)
			   {					    
				   re_udp_pack_sta=re_sta;
			   }
               else if(rec_dat[2]==file_on)
			   {				   
				   re_udp_pack_sta=file_on;
			   }
			   else if(rec_dat[2]==sta_re)// 接收状态回复包
			   {				   
				     
				 int p_t;
				 long p_arr;				  
                 //send_sta_req_cou=0;      //复位状态请求次数
				 re_udp_pack_sta=re_sta;//置状态回复标志=有回应
				 p_t=rec_dat[3]*256+rec_dat[4];
				 for(int t=0;t<p_t;t++)
				 {
				  p_arr=rec_dat[t*3+5]*256*256+rec_dat[t*3+6]*256+rec_dat[t*3+7];
				  arr_mis_pack[p_arr]=f_mis;//写入状态阵列
				 }				  
			   }
			   else if(rec_dat[2]==udp_fin)// 接收完成回复包
			   {		
				    
				   flag_udp_send=udp_rec_fin;
			   }			   
			  else
			  {
		        pdlg->dowith_pro(my_udp_sock,rec_len,0,udp_recv_addr,0);
			  }
		  }		   		 
	  }
	}
	return 1;
}
 
UINT udp_send(LPVOID pParam)//发送udp 数据
{
	CCtrlDlg *pdlg = (CCtrlDlg *)pParam;
	
    if(head==NULL)
	{		 
		return 1;
	}
	/*
	int nrcvbuf=1024*32; 	 
	//写缓冲,读缓冲为SO_RCVBUF
	int err=setsockopt(my_udp_sock,SOL_SOCKET,SO_SNDBUF,(char *)&nrcvbuf,sizeof(nrcvbuf)); 
	if (err != NO_ERROR) 
	{ 	 
	return 1;
	} 	 
	*/
	CFile fil; 	
//	struct    sockaddr_in saDest; 	
 
    struct send_stru *my;
	my=head;
	CString strip,strinf;
	CString strport;
	CString path,name;
    BOOL sendok;
    do 
	{	 
		sendok=0;
		if(my->sta==to_be_send)//是等待发送状态
		{ 			 
            //sendok=0;
			//目的 端口、IP、文件路、名。写方式
			//原路
			flag_udp_send=udp_dat_star;	              
			int cou;
			//saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
			path =my->sour_path;
			CString sdpath=my->der_path;
			int nastar=path.ReverseFind('\\');
			int len=path.GetLength();
			name.Empty();
			for(int na=(nastar+1);na<len;na++)
			{
				name+=path.GetAt(na);
				//sdpath+=path.GetAt(na);
			}
			sdpath=sdpath+'\\'+name;
			if(!(fil.Open(path,CFile::modeRead)))
			{			 
                 strinf="打开文件"+name+"失败";
				pdlg->addinf(strinf);				 
			}			
			else
			{    				 
				cou=fil.GetLength();				
				//unsigned cha  r re_udp_pack_sta;//接收状态请求标志
				//#define no_re_sta '0'   //未回应
				//#define re_sta '1'      //有回应
				re_udp_pack_sta=no_re_sta;
				//unsigned char flag_udp_send;//数据是否传输完成标志
				//#define udp_dat_star '1'   //未完成
				//#define udp_rec_fin  '3'  //传输完成		    
				
				BOOL send_star=1;
				unsigned char send_sta_req_cou=0;
				//stru_rec send; 
				stru_file file_pro;
				file_pro.rec_head[0]=0xaa;
				file_pro.rec_head[1]=0x55;			
				//file_pro.file_path
				//	file_pro.file_mode
				file_pro.file_len=cou;
				file_pro.rec_pro=acc_syn_udp;
				strcpy((char *)file_pro.file_path,sdpath);
				//file_pro.file_len=cou;
				file_pro.file_mode=my->send_mode;
				flag_udp=star;			 	 
				//	flag_udp_send=udp_fin;
				if(send(sock_arr[my->p_send_sock],(const char *)&file_pro.rec_head,sizeof(stru_file)+1,0)==SOCKET_ERROR)	   				 
				{
					 //该屏已断开
					::AfxMessageBox("seep");
					 strinf=strip+"已断开";
                     my->sta=noip;
		 	         pdlg->addinf(strinf);  
				}
				else
				{
					BOOL re_ok=0;					 
					for(unsigned int recfla=0;recfla<300;recfla++)
					{					 
						Sleep(10);//循环检测有回应
						if(re_udp_pack_sta!=no_re_sta)
						{
							if(re_udp_pack_sta==file_on)  
							{
								strinf="文件"+name+"已存在";
								my->sta=fileon;
								pdlg->addinf(strinf);
							}
							else
							{
								re_ok=1;
							}
							recfla=301;
						}
					}
					if(re_ok)//协商成功
					{ 						
						SOCKET tcp_con_sock;	         
						struct sockaddr_in my_addr,con_addr;  		 
						if((tcp_con_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP))<0)
						{
							AfxMessageBox("tcp sock err !");
						} 	 
						BOOL val;
						val = TRUE;
						//SO_REUSEADDR选项就是可以实现端口重绑定的
						if(setsockopt(tcp_con_sock,SOL_SOCKET,SO_REUSEADDR,(char *)&val,sizeof(val))!=0)
						{
							AfxMessageBox("error!setsockopt failed!\n");
							return 1;
						}
						my_addr.sin_family = AF_INET;			// destination address
						//my_addr.sin_port = (int) changport(m_tcport);
						my_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
						if(SOCKET_ERROR ==bind(tcp_con_sock,(LPSOCKADDR)&my_addr, sizeof(sockaddr)))
						{
							AfxMessageBox("bind tcp socket error !");
							closesocket(tcp_con_sock);
							WSACleanup();	
							//EndDialog(0);
							return 1;
						}
						else
						{
							// AfxMessageBox("bind socket ok !");
						}	 
						con_addr.sin_family = AF_INET;
						strport=(CString)my->port;
					 	con_addr.sin_port =ntohs((unsigned short)atoi(strport));
						//con_addr.sin_port+=1;
						strip=(CString)my->ip_addr;
						con_addr.sin_addr.S_un.S_addr=inet_addr(strip);
						/*
						unsigned long lon=inet_addr(strip);//转换ip字符串为32bit		 				 
						con_addr.sin_addr.S_un.S_un_b.s_b1=(unsigned char)lon;
						con_addr.sin_addr.S_un.S_un_b.s_b2=(unsigned char)(lon>>8);
						con_addr.sin_addr.S_un.S_un_b.s_b3=(unsigned char)(lon>>16);
						con_addr.sin_addr.S_un.S_un_b.s_b4=(unsigned char)(lon>>24);
						con_addr.sin_port = (int)changport(strport);		 
						*/	 
						if(connect(tcp_con_sock,  (LPSOCKADDR)&con_addr,sizeof(SOCKADDR_IN))==SOCKET_ERROR)
						{	 
							my->sta=noip;
							AfxMessageBox("连接失败!\b\r该屏已断开或者已建立连接");
						//	pdlg->set_stabar("连接失败!\b\r该屏已断开或者已建立连接");
						}
						else
						{	
							tcp_acc_sock=tcp_con_sock;
						     pdlg->close_tcp();
							//::Sleep(300);
							strinf="开始发送"+name;
                            CString sttimer;
							sttimer=pdlg->getcurrtimer();
							 strcpy((char *)my->start_timer,sttimer);
							pdlg->addinf(strinf);
						//	int sendlen=1024*1024*3;
							int sendlen=1024*31;
							char *data = new char[sendlen+1];//创建数据缓冲区
							//void far *p=::GlobalAlloc(0,cou);
							/*
							if(p==NULL)
							{
							}
							else
							{
							*/
							//	DWORD relen=fil.ReadHuge(data,cou);
								/*
								CString re;
								re.Format("%u",relen);
								::AfxMessageBox(re);
								*/
								int idx=0;
								int nrcvbuf=sendlen+1; 	 
								//SO_SNDBUF写缓冲,读缓冲为SO_RCVBUF
								int err=setsockopt(tcp_con_sock,SOL_SOCKET,SO_SNDBUF,(const char *)&nrcvbuf,sizeof(int)); 
								if (err != NO_ERROR) 
								{ 	 
									::AfxMessageBox("setsockopt err");
									return 1;
								} 
								CString str;
								int filen=0;
								//int packlen=1024*1024*2;
								int tatolen=cou;		
								int pges;
								while(cou>0)
								{
									if(cou>sendlen)
									{
                                        filen=sendlen;
									}
									else
									{
                                       filen=cou;
									}
									fil.ReadHuge(&data[0],filen);
									int sendlen=send(tcp_con_sock,&data[0],filen,0);	   				 
									if(sendlen==SOCKET_ERROR)
									{
										//发送中断
										my->sta=noip;
										strinf="无法发送"+name+"到"+strip+' '+strport;
//										pdlg->set_stabar(strinf);										 
										pdlg->addinf(strinf);
										cou=0;
									}
									else
									{										 
										idx+=sendlen;
										cou-=sendlen;
										my->sta=sending;
									    //str.Format("%u",sendlen);
                                       // AfxMessageBox(str);
										pges=(tatolen-cou)*100/tatolen;
										pdlg->m_gtcp.SetPos(pges+1);
										str.Format("%u",pges);
										strinf="发送"+name+"到"+strip+' '+strport+' '+str+'%';
									//	pdlg->strsta=strinf;
//									    pdlg->set_stabar(strinf);
										if(tatolen>idx)
										{
										}
										else
										{								
											if(tatolen==idx)
											{
												re_udp_pack_sta=no_re_sta;
												for(unsigned int recfla=0;recfla<900;recfla++)
												{					 
													Sleep(10);//循环检测有回应
													if(re_udp_pack_sta!=no_re_sta)
													{												 
														if(re_udp_pack_sta==udp_fin)  
														{
															my->sta=send_ok;
															sttimer=pdlg->getcurrtimer();
							                                  strcpy((char *)my->finish_timer,sttimer);
															strinf="发送"+name+"到"+strip+' '+strport+' '+"完成";
															pdlg->m_gtcp.SetPos(100);
														  // pdlg->set_stabar(strinf);
															pdlg->addinf(strinf);
															//·0-------不允许继续接收数据    //·1-------不允许继续发送数据      //·2-------不允许继续发送和接收数据,均为允许则调用close () 
															//	::shutdown(tcp_con_sock,2);
															unsigned char cha[6];
															cha[0]=0xaa;
															cha[1]=0x55;
															cha[2]=fil_fin_ack;
															if(send(sock_arr[my->p_send_sock],(const char *)cha,5,0)==SOCKET_ERROR)	   				 
															{
															}
															::closesocket(tcp_con_sock);
														}										 
														recfla=901;
														cou=0;
													}
												}								 
											}
											else
											{
												my->sta=breaked;
												strinf="发送"+name+"到"+strip+' '+strport+' '+"中断";
											 //   pdlg->set_stabar(strinf);
												pdlg->addinf(strinf);	
											}												
										}	
									}
								}								 
								fil.Close();
								::delete [] data;
							 // shutdown(tcp_con_sock,2);
							  ::closesocket(tcp_con_sock);
						}//连接成功						
					}//协商成功
				}//发送	协商成功 
			}//打开文件成功
		}//是等待发送状态
		//del=my;	 
		fil.Close();
		my=my->next;
	//	pdlg->m_gtcp.SetPos(0);
	//	head=my;
		/*
		if(sendok)
		{
			strinf="发送"+name+"到"+strip+' '+strport+' '+"完成";
			pdlg->addinf(strinf);	 
		}
		*/
   }while(my!=NULL); 
 //  head=NULL;
   bit_send_thread=0;
   return 1;
}
CCtrlDlg::CCtrlDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCtrlDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CCtrlDlg)
	m_server = _T("");
	m_server_tcport = _T("");
	m_server_udport = _T("");
	m_tcport = _T("");
	m_udport = _T("");
	m_ltd = _T("");
	m_ip = _T("");
	m_name = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCtrlDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CCtrlDlg)
	DDX_Control(pDX, IDC_PROGRESS1, m_gtcp);
	DDX_Control(pDX, IDC_PLAYFILESIZE, m_currsize);
	DDX_Control(pDX, IDC_PLAYFILENAME, m_currname);
	DDX_Control(pDX, IDC_PLAYFILESERI, m_currseri);
	DDX_Control(pDX, IDC_EDIT1, m_edit);
	DDX_Control(pDX, IDC_TREE2, m_treedir);
	DDX_Control(pDX, IDC_LIST1, m_listtable);
	DDX_Control(pDX, IDC_LIST4, m_listcon);
	DDX_Control(pDX, IDC_TREE1, m_tree);
	DDX_Text(pDX, IDC_SERVER, m_server);
	DDX_Text(pDX, IDC_SERVER_TCPORT, m_server_tcport);
	DDX_Text(pDX, IDC_SERVER_UDPORT, m_server_udport);
	DDX_Text(pDX, IDC_TCPORT, m_tcport);
	DDX_Text(pDX, IDC_UDPORT, m_udport);
	DDX_Text(pDX, IDC_LTD, m_ltd);
	DDX_Text(pDX, IDC_IP, m_ip);
	DDX_Text(pDX, IDC_NAME, m_name);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CCtrlDlg, CDialog)
	//{{AFX_MSG_MAP(CCtrlDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_COMMAND(ID_TBSTARTCP, OnTbstartcp)
	ON_COMMAND(ID_TBSTARTUDP, OnTbstartudp)
	ON_COMMAND(ID_TBSTOPTCP, OnTbstoptcp)
	ON_COMMAND(ID_TBSTOPUDP, OnTbstopudp)
	ON_COMMAND(IDC_MENUSTARTCP, OnMenustartcp)
	ON_COMMAND(IDC_MENUSTARUDP, OnMenustarudp)
	ON_COMMAND(IDC_MENUSTOPTCP, OnMenustoptcp)
	ON_COMMAND(IDC_MENUSTOPUDP, OnMenustopudp)
	ON_COMMAND(ID_MENUCHANGTCPORT, OnMenuchangtcport)
	ON_COMMAND(ID_MENUCHANGUDPORT, OnMenuchangudport)
	ON_COMMAND(ID_MENUCHANGLTD, OnMenuchangltd)
	ON_COMMAND(IDC_MENUCHANGSERVERDNS, OnMenuchangserverdns)
	ON_COMMAND(IDC_MENUCHANGSERVERTCPORT, OnMenuchangservertcport)
	ON_COMMAND(IDC_MENUCHANGSERVERUDPORT, OnMenuchangserverudport)
	ON_NOTIFY(NM_RCLICK, IDC_TREE1, OnRclickTree1)
	ON_NOTIFY(NM_CLICK, IDC_TREE1, OnClickTree1)
	ON_COMMAND(IDC_MENUREFLASHSERVER, OnMenureflashserver)
	ON_COMMAND(IDC_MENUTCPCONNET, OnMenutcpconnet)
	ON_COMMAND(IDC_MENUCHANGLTDPASS, OnMenuchangltdpass)
	ON_COMMAND(IDC_POPMENU2FLASH, OnPopmenu2flash)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?