⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opam300cdlg.cpp

📁 wince下接受网络控制命令进行相应操作,远程控制的东西
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	return;
}

//取CE机剩余物理内存
long COpAm300cDlg::GetphyMemory()
{
	long avaiphys;
	MEMORYSTATUS MemStat;
	MemStat.dwLength = sizeof(MEMORYSTATUS);
	GlobalMemoryStatus(&MemStat);
	avaiphys=MemStat.dwAvailPhys;
	//delete lpBuffer;
	return avaiphys;
}

/*开启SOCKET SERVER 服务,监听3815端口*/
/************************************************
说明:以下的是开启TCPSERVER,并监听相关的通信情况
    由于现只是放在了BUTTON的事件里,故需要改一下,
	在点击这个BUTTON时,重新开启一个线程去执行它,
	而不是放在此处,另需加一个配置文件或其它方式
	用于存储自动开关的值。此处是10月15日加的,为
	AutoReset,值为1自动重启,为0不进行自动重启,
	在接收到时处理变量后并写到相关的配置处,及
	ResetTime,详细见函数体内
**************************************************/
UINT COpAm300cDlg::StartSockSvr(LPVOID pParam)
{
	COpAm300cDlg *pDlg=(COpAm300cDlg *)pParam;
	SOCKET hSocket,ClientSocket;
	hSocket=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP ); 
	//创建服务器端Socket,类型为SOCK_STREAM,面向连接的通信
	if (hSocket == INVALID_SOCKET)
	{ 
		TRACE0("无法创建服务器!");
		WSACleanup();
		return 1;
	}

	SOCKADDR_IN SocketAddr;
	SocketAddr.sin_family = AF_INET;	
	SocketAddr.sin_port = htons(3815);
	SocketAddr.sin_addr.s_addr = INADDR_ANY; 

	if (bind(hSocket, (LPSOCKADDR)&SocketAddr,
		sizeof(SocketAddr)) == SOCKET_ERROR) //与选定的端口绑定
	{
		TRACE0("无法绑定服务器!");
		WSACleanup();
		return 1;
	}

	if (listen(hSocket, 5/*QUEUE_SIZE*/) == SOCKET_ERROR) //开始监听客户连接请求
	{
		TRACE0("服务器监听失败!");
		WSACleanup();
		return 1;
	}

	while(1)
	{
		BOOL bConnect = FALSE;
		BOOL bFileOpen = FALSE;
		int nBuf=0;
//		SOCKET ClientSocket;
		int nLength;
		SOCKADDR_IN sockAddr;
		memset( &sockAddr, 0, sizeof( sockAddr ) );
		ClientSocket = accept(hSocket, (LPSOCKADDR)&sockAddr, (LPINT)&nLength);
		send(ClientSocket,"连接成功\r\n",strlen("连接成功\r\n"),0);
		//pDlg->UpdateEdit(inet_ntoa(sockAddr.sin_addr));
		
		if (ClientSocket == INVALID_SOCKET)
		{
			TRACE0("Server socket failed to accept connection.");
			WSACleanup();
			return 1;
		}

		int len;
		char szBuf[2048];
		bConnect = TRUE;
		while(bConnect)
		{
			len = recv(ClientSocket,&szBuf[0],2048,0);

			//pDlg->UpdateEdit(&szBuf[0]);
			CFile File;

			if(len == SOCKET_ERROR || len == 0)
			{
				TRACE0("接收出错!");
				closesocket(ClientSocket);
				bConnect = FALSE;

				break;
			}

			szBuf[len]=0;
			if(strstr(&szBuf[0],"DeleteFile;\r\n")!=NULL)
			{
				//在这里通过STRSTR来检索子串,如果是DELETEFILE则执行删除操作

				/*对于有错误的配置文件的操作(DELETE),当监听到DELETEFILE命令*/
				try
				{
					pDlg->CloseAm300c();
					Sleep(200);
					DeleteFile(L"硬盘\\AM300C\\am300c.ini");
//					DeleteFile(L"硬盘\\AM300C\\status.ini");
//					DeleteFile(L"硬盘\\AM300C\\startinfo.ini");
//					DeleteFile(L"硬盘\\AM300C\\tempstatus.ini");
					send(ClientSocket,"配置文件及状态文件已删除\r\n",strlen("配置文件及状态文件已删除\r\n"),0);
					pDlg->StartupAm300c();
				}
				catch(...)
				{
					send(ClientSocket,"删除配置文件及状态文件出错\r\n",strlen("删除配置文件及状态文件出错\r\n"),0);
				}

			}
			else if (strstr(&szBuf[0],"CaptureScreen;\r\n")!=NULL)//捕捉下位机屏幕信息
			{
				LPCTSTR filename = L"硬盘\\AM300C\\CopyScreen.bmp";
				
				DeleteFile(filename);

				HBITMAP hBitmap = pDlg->CopyScreenToBitmap();
				
				LPSTR lpstr = pDlg->GettingBits(hBitmap);

				BOOL SaveScreen = pDlg->SaveDIBToFile(lpstr, filename);

				CloseHandle(hBitmap);

				DeleteObject(hBitmap);
			
				if (lpstr != NULL)
				{
					LocalFree((HLOCAL)lpstr);

					lpstr = NULL;
				}

				if (SaveScreen)
				{
					CFile bmpFile(filename, CFile::typeBinary | CFile::modeRead);

					char *bmpBuf;

					long fileLen = bmpFile.GetLength();

					bmpBuf = new char[fileLen];

					bmpFile.Read(bmpBuf,fileLen);

					char restr[20];

					sprintf(restr,"BmpLength:%d\r\n",fileLen);

					send(ClientSocket, restr, strlen(restr), 0);

					send(ClientSocket, bmpBuf, fileLen, 0);

					bmpFile.Close();

					delete[] bmpBuf;

				}
				else
				{
					send(ClientSocket,"取得下位机屏幕信息失败\r\n",strlen("取得下位机屏幕信息失败\r\n"),0);
				}
			}
			else if (strstr(&szBuf[0],"GetLog:")!=NULL)  //取日志---对应日期的日志文件
			{
				CString s_FileDate = szBuf;
				//wcscpy(LPCTSTR(s_FileDate), &szBuf[0]);
				s_FileDate.Delete(0,7);
				s_FileDate.TrimRight();
				LPCTSTR filename = L"硬盘\\AM300C\\" + s_FileDate;
				//::MessageBox(NULL,filename,L"info",0);

				try
				{
					CFile logFile;
					if (logFile.Open(filename, CFile::typeBinary | CFile::modeRead | CFile::modeNoTruncate | CFile::shareDenyNone) != NULL)
					{

						char *logBuf;

						long fileLen = logFile.GetLength();

						
						logBuf = new char[fileLen];

						logFile.Read(logBuf,fileLen);

						char restr[20];

						sprintf(restr,"LogLength:%d\r\n",fileLen);

						send(ClientSocket, restr, strlen(restr), 0);

						send(ClientSocket, logBuf, fileLen, 0);

						logFile.Close();

						delete[] logBuf;
					}
					else
					{
						send(ClientSocket,"当前日志不存在\r\n",strlen("当前日志不存在\r\n"),0);
					}

				}
				catch(...)
				{
					send(ClientSocket,"取日志操作失败\r\n",strlen("取日志操作失败\r\n"),0);
				}
			}
			else if(strstr(&szBuf[0],"RenameFile;\r\n")!=NULL)
			{
				//重命名文件
				//CopyFile(
				//CFile::Rename(
			}
			else if(strstr(&szBuf[0],"SoftReset;")!=NULL)
			{
				//在这里进行软件的重启动作,先利用消息WM_CLOSE关闭程序
				//再利用进程控制关闭得到的AM300C的进程,是为了防止因为异常
				//AM300C没关彻底
				try
				{
					pDlg->CloseAm300c();
					pDlg->StartupAm300c();						
					send(ClientSocket,"软件已刷新\r\n",strlen("软件已刷新\r\n"),0);
				}
				catch(...)
				{
					send(ClientSocket,"软件刷新出错\r\n",strlen("软件刷新出错\r\n"),0);
				}
			}
			else if(strcmp(&szBuf[0],"MachineReset;\r\n")==0)
			{
				//在这里进行机器的重启
				//首先还是要先发WM_CLOSE消息给AM300C
				//然后利用软等待等100MS
				//然后再对机器进行重启
				try
				{
					pDlg->CloseAm300c();

					//***************关闭音乐通道***************
					pDlg->CommPortOpen();
					pDlg->Mute(L"aa 05 10 00");
					pDlg->Mute(L"aa 06 10 00");
					Sleep(1000);		//等待1秒
					//******************************************

					send(ClientSocket,"机器正在刷新,稍后请重新连接\r\n",strlen("机器正在刷新,稍后请重新连接\r\n"),0);

					pDlg->PowerOff();	//挂起
					Sleep(2000);		//等待2秒
					pDlg->RebootCE();	//Reset
					
				}
				catch(...)
				{
					send(ClientSocket,"机器刷新失败\r\n",strlen("机器刷新失败\r\n"),0);
				}
			}
			else if(strcmp(&szBuf[0],"GetStatus;\r\n")==0)
			{
				//在这里利用FINDWINDOW得到当前AM300C是否在运行
				HWND hwnd=::FindWindow(NULL,L"CEAm300");
				
				if (hwnd==NULL)
				{
					send(ClientSocket,"软件未运行或运行有错\r\n",strlen("软件未运行或运行有错\r\n"),0);
				}
				else
					send(ClientSocket,"软件正在运行\r\n",strlen("软件正在运行\r\n"),0);
			}
			else if (strcmp(&szBuf[0],"GetPhys;\r\n")==0)
			{
				//在这里读取下位机的可用物理内存
				char restr[20];
				sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
				send(ClientSocket,restr,strlen(restr),0);
				try
				{
					free(restr);
				}
				catch(...)
				{
					;
				}
			}
			else if (strstr(&szBuf[0],"COM:")!=NULL)
			{
				//在这里播放音乐
				char restr[100];
				int i=0;
				int j=0;
				for (i=4;i<strlen(szBuf);i++)
				{
					if ((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
					{
						restr[j]=szBuf[i];
						j++;
					}
				}
				restr[j]=0;
				//那么restr就是音乐路径及名称;
				
			
				try
				{
					pDlg->SendToCom(restr);
					send(ClientSocket,restr,strlen(restr),0);
				}
				catch(...)
				{
					;
				}
				//sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
				//send(ClientSocket,restr,strlen(restr),0);
				
			}
			else if (strstr(&szBuf[0],"musicplay:")!=NULL)
			{
				//在这里播放音乐
				char restr[200];
				int i=0;
				int j=0;
				for (i=10;i<strlen(szBuf);i++)
				{
					if ((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
					{
						restr[j]=szBuf[i];
						j++;
					}
				}
				restr[j]=0;
				//那么restr就是音乐路径及名称;
				charToWCh(pDlg->musicname,restr);
				
				try
				{
					if (pDlg->Played)
					{
						pDlg->closemusic();
						pDlg->Played=false;
					}
				}
				catch(...)
				{
					;
				}
				try
				{
					/*在线程中单独调用DSHOW测试*/
					IGraphBuilder *pGraph3;  
					IMediaControl *pMediaControl3;
					wchar_t *musicname2;
					musicname2=pDlg->musicname;
					CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, IID_IGraphBuilder, (void **)&pGraph3);
					pGraph3->QueryInterface(IID_IMediaControl, (void **)&pMediaControl3); 
					/* 连接播放指定文件所需的filter */ 
					//pGraph->RenderFile(strMusicName, NULL); 
					/* 开始播放指定的文件 */ 
					int sl=wcslen(musicname2);
					musicname2[sl]=0;
					pGraph3->RenderFile(musicname2,NULL);
					//pMediaControl3->RenderFile(musicname2);//strMusicName
					pMediaControl3->Run(); 

					/*pDlg->playmusic();*/
					pDlg->Played=true;

				//	if state==true 
						send(ClientSocket,restr,strlen(restr),0);
				//	else
				//		send(ClientSocket,"播放不成功\r\n",strlen("播放不成功\r\n"),0);	
				}
				catch(...)
				{
					send(ClientSocket,"播放不成功\r\n",strlen("播放不成功\r\n"),0);
				}
				
				//sprintf(restr,"%d\r\n",pDlg->GetphyMemory());
				//send(ClientSocket,restr,strlen(restr),0);
				
			}
			else if (strstr(&szBuf[0],"musicstop;")!=NULL)
			{
				//在这里停止播放音乐
				
				try
				{
					pDlg->stopmusic();
					//if state==true
					   send(ClientSocket,"停止播放\r\n",strlen("停止播放\r\n"),0);
					//else
					//   send(ClientSocket,"停止播放出错\r\n",strlen("停止播放出错\r\n"),0);
					
				}
				catch(...)
				{
					send(ClientSocket,"停止播放出错\r\n",strlen("停止播放出错\r\n"),0);
				}	
				
			}

			else if(strstr(&szBuf[0],"ModIPAddresss:")!=NULL)
			{
				//修改当前的WINCE主机IP地址为设定值
				int i=0;
				int j=0;
				char restr[40];
				for(i=14;i<strlen(szBuf);i++)
				{
					if((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
					{
						restr[j]=szBuf[i];
						j++;
					}
				}
				restr[j]=0;
				try
				{
					if(pDlg->ModifyIP(restr))
					{

						send(ClientSocket,"IP地址已更新\r\n",strlen("IP地址已更新\r\n"),0);
					}
					else
					{
						send(ClientSocket,"IP地址未更新\r\n",strlen("IP地址未更新\r\n"),0);
					}
				}
				catch(...)
				{
					;
				}
				try
				{
					free(restr);
				}
				catch(...)
				{
					;
				}
			}
			else if(strstr(&szBuf[0],"ModWinceName:")!=NULL)
			{
				//修改当前的WINCE主机名称为设定值
				int i=0;
				int j=0;
				char restr[50];
				for(i=13;i<strlen(szBuf);i++)
				{
					if((szBuf[i]!='\r')&&(szBuf[i]!='\n') && (szBuf[i]!=';'))
					{
						restr[j]=szBuf[i];
						j++;
					}
				}
				restr[j]=0;
				if(pDlg->ModifyName(restr))
				{
					send(ClientSocket,"更新机器名成功\r\n",strlen("更新机器名成功\r\n"),0);
				}
				else
				{
					send(ClientSocket,"更新机器名失败\r\n",strlen("更新机器名失败\r\n"),0);
				}
				try
				{
					free(restr);
				}
				catch(...)
				{
					;
				}
			}
			else if (strstr(&szBuf[0],"SendAm300c:")!=NULL)
			{
				int i,j;
				char rN[8];				
				i=0;
				j=0;
				//解析出文件流的长度
				//for (i=11; i<11+8+2; i++)
				pDlg->CloseAm300c();
				for (i=11; i<11+8; i++)
				{
					rN[j]=szBuf[i];
					j++;
				}
				rN[j]=0;
				//纪录文件流的长度
				TCHAR mychar[10];
				memset(mychar,0,9);
				charToWCh(&mychar[0],&rN[0]);
				nBuf = atoi(mychar);//文件长度
				
				LPCTSTR filename=L"硬盘\\am300c\\amce300.exe";//文件名
				
				DeleteFile(filename);//要接收新的更新程序,必须先要删了原先的文件
				CFile file(filename,CFile::modeCreate | CFile::modeWrite);//创建新文件
				char buffer[1024]={0};//接收缓冲区
				if (len > i ) 
				{
					// 读接收文件时有文件数据过来
					for (j=i+1;j<=len ;j++)
						buffer[j-i-1]=szBuf[j];
					if (nBuf>(len-i))
					{
						file.Write(buffer,len-i);//把多余的写入文件

⌨️ 快捷键说明

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