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

📄 socket_udpserver.cpp

📁 用数据库控制树型控件现实内容的例子
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// Socket_UdpServer.cpp: implementation of the CSocket_UdpServer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Kill.h"
#include "Socket_UdpServer.h"
#include "protocol.h"
#include "MainFrm.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSocket_UdpServer::CSocket_UdpServer()
{
	WSADATA wsdata;
	//启动SOCKET库,版本为2.0
	WSAStartup(0x0202,&wsdata);
	CoInitialize(NULL);
//    m_db.CreateInstance(__uuidof(Connection));
    HRESULT hRes;
	try
	{
        hRes=m_db.CreateInstance(_T("ADODB.Connection"));
		m_db->ConnectionTimeout = 8;
		
		hRes=m_db->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase\\KillData.mdb",
            _T(""),_T(""),adModeUnknown);
	}
	catch(_com_error e)///捕捉异常
	{
		 CString errormessage;
		 errormessage.Format(_T("连接City.mdb数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
		 AfxMessageBox(errormessage);///显示错误信息
		 exit(0);
	} 
}

CSocket_UdpServer::~CSocket_UdpServer()
{

}

void CSocket_UdpServer::StartServer(int port,int clientport)
{
	HANDLE	hThread;
    DWORD	dwThreadId;

	sockaddr_in a;

	a.sin_family=AF_INET;
	a.sin_addr.s_addr=0;
	a.sin_port=htons(port);
	closesocket(m_Udpsocket);

	m_Udpsocket=socket(AF_INET,SOCK_DGRAM,0);
	bind(m_Udpsocket,(sockaddr *)&a,sizeof(sockaddr_in));
	m_Param.S=m_Udpsocket;
	m_Param.port=clientport;
	m_Param.m_db=m_db;
	
    hThread = CreateThread(NULL, 0, DealProc, (LPVOID)(&m_Param), 0, &dwThreadId);
    hThread = CreateThread(NULL, 0, ComputerOnlineThread, (LPVOID)(&m_Param), 0, &dwThreadId);
	
}




DWORD CALLBACK CSocket_UdpServer::DealProc(LPVOID lpParm)
{
	char buf[MAX_PACKET_SIZE];
	DataPacketHeader SendPacketHeader;

	struct  paramstruct  * pParam=(struct  paramstruct  *)lpParm;
	DataPacketHeader *pPacketHeader;
	SOCKET  s;
	sockaddr_in from;
	int fromlength=sizeof(SOCKADDR);
	int  recvlen;
    _ConnectionPtr Sdb;

	ZeroMemory(buf,MAX_PACKET_SIZE);
	CoInitialize(NULL);
    Sdb.CreateInstance(__uuidof(Connection));
    HRESULT hRes;
	try
	{
        hRes=Sdb.CreateInstance(_T("ADODB.Connection"));
		Sdb->ConnectionTimeout = 8;
		//连接ACCESS2000
		hRes=Sdb->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=DataBase\\KillData.mdb",
            _T(""),_T(""),adModeUnknown);
	}
	catch(_com_error e)///捕捉异常
	{
		 CString errormessage;
		 errormessage.Format(_T("连接City.mdb数据库失败!\r\n错误信息:%s"),e.ErrorMessage());
		 AfxMessageBox(errormessage);///显示错误信息
	} 

	from.sin_family=AF_INET;
	from.sin_addr.s_addr=INADDR_ANY;

	s=pParam->S;
	while(true)
	{
		from.sin_port=htons(pParam->port);
		recvlen=recvfrom(pParam->S,buf,MAX_PACKET_SIZE,0,(struct sockaddr FAR *)&from,(int FAR *)&fromlength);
		if(recvlen==SOCKET_ERROR)
		{
			int errorno=WSAGetLastError();
			if(errorno==WSAEMSGSIZE)
				AfxMessageBox("发送的数据包过长");
			else if(errorno==WSAEFAULT)
				AfxMessageBox("收到的数据包的地址范围不对");
			else if(errorno==WSAETIMEDOUT)
				AfxMessageBox("接收超时");
			else if(errorno==WSAETIMEDOUT)
				AfxMessageBox("接收超时");
			else if(errorno==WSAESHUTDOWN)
			{
				AfxMessageBox("socket对象由于外力原因已经被关闭了,必须重新启动");
				closesocket(pParam->S);
				break;
			}
//			break;
		}
		pPacketHeader=(DataPacketHeader *)buf;
		recvlen=pPacketHeader->mesagelen;

		switch (pPacketHeader->function)
		{
		case 1:
			//注册信息
			AddNewComputer(Sdb,buf+sizeof(DataPacketHeader),recvlen);
			SendPacketHeader.function=129;
			strcpy(SendPacketHeader.sysinfo,SYSTEMINFOSTR);
			SendPacketHeader.ComputerId=pPacketHeader->ComputerId;
			SendPacketHeader.mesagelen=0;
			break;
		case 2:
			ComputerOnLine(Sdb,buf+sizeof(DataPacketHeader),recvlen,pPacketHeader->ComputerId);
			SendPacketHeader.function=130;
			strcpy(SendPacketHeader.sysinfo,SYSTEMINFOSTR);
			SendPacketHeader.ComputerId=pPacketHeader->ComputerId;
			SendPacketHeader.mesagelen=0;
			//心跳信息
			break;
		case 3: //获取密码
			from.sin_port=htons(pParam->port);
			CheckPassword(buf+sizeof(SendPacketHeader),pParam->S, from,pPacketHeader->ComputerId);
			continue;
		case 134://安装策略应答包
			InstallBack(Sdb,buf+sizeof(DataPacketHeader),pParam->S,pPacketHeader->ComputerId);
			continue;

		case 135://卸载策略应答包
			UnInstallBack(Sdb,buf+sizeof(DataPacketHeader),pParam->S,pPacketHeader->ComputerId);
			continue;
			
		default:
//			AfxMessageBox("数据包功能号错误");
			continue;
		}
		memset(buf,0,sizeof(SendPacketHeader)+2);
		memcpy(buf,&SendPacketHeader,sizeof(SendPacketHeader));
		from.sin_port=htons(pParam->port);
		sendto(pParam->S,buf,sizeof(SendPacketHeader)+2,0,(struct sockaddr*)&from,fromlength);
	}
	return 1;
}


void CSocket_UdpServer::SendStr(char *str, char *IP, int port, int strlen)
{
	sockaddr_in server;
	int len =sizeof(server);

	server.sin_family=AF_INET;
	server.sin_port=htons(port); ///server的监听端口
	server.sin_addr.s_addr=inet_addr(IP); ///server的地址 
	*(str+strlen)=0;
	if (sendto(m_Udpsocket,str,strlen,0,(struct sockaddr*)&server,len)==SOCKET_ERROR)
	{
		AfxMessageBox("还没有启动socket服务");
	}
}


void CSocket_UdpServer::InstallKill(int ComputerID, char *IP,int port,char * url)
{
	char  packet[MAX_PACKET_SIZE];
	int   packetlen;
	DataPacketHeader PacketHeader;
	CString sqlStr;
	try
	{
		CMainFrame * pMain=(CMainFrame *)AfxGetMainWnd();
		PacketHeader.ComputerId=inet_addr(IP);
		PacketHeader.function=6;
		strcpy(PacketHeader.sysinfo,SYSTEMINFOSTR);

	_RecordsetPtr m_pRecordset;    
	HRESULT hTRes;
	sqlStr.Format("select * from computers where isInstallKill=0 and IpAddress='%s'",IP);
	hTRes = m_pRecordset.CreateInstance(_T("ADODB.Recordset"));
	if (SUCCEEDED(hTRes))
	{
            //----------------------------------------------------
	        hTRes = m_pRecordset->Open(sqlStr.AllocSysString(),
		         _variant_t((IDispatch *)(pMain->m_SocketServer.m_db),true),
				 adOpenStatic,adLockOptimistic,adCmdText);
			int i=m_pRecordset->GetRecordCount();
			if(m_pRecordset->adoEOF)
			{
				m_pRecordset->Close();
				return;
			}
	}
	m_pRecordset->Close();

		PacketHeader.mesagelen=pMain->m_InstallUrl.GetLength()+pMain->m_UnInstallUrl.GetLength()+3;

		memset(packet,0,MAX_PACKET_SIZE);
		packetlen=sizeof(PacketHeader);
		memcpy(packet,&PacketHeader,packetlen);
		sprintf(packet+packetlen,"%s,%s",pMain->m_InstallUrl.GetBuffer(0),pMain->m_UnInstallUrl.GetBuffer(0));
	
		SendStr(packet,IP,port,packetlen+PacketHeader.mesagelen);
		_CommandPtr Cmd1;
		CString sqlstr;
		Cmd1.CreateInstance( __uuidof( Command ) );
		Cmd1->ActiveConnection = m_db;
		sqlstr.Format("update computers set Cmd_Install=1 where IpAddress='%s' ",IP);
		Cmd1->CommandText=sqlstr.AllocSysString();
		Cmd1->Execute( NULL, NULL, adCmdText );	
	}
	catch(...)
	{
	}
}

void CSocket_UdpServer::InstallGroup(int GroupID, int port, char *url,int type)
{
	char IP[30];
	_RecordsetPtr m_pRecordset;    //用于创建一个查询记录集
	_RecordsetPtr m_pGroupRecordset;
	CString strSQL,strCurItem;
	HRESULT hTRes;

	if(type==1)
	{
	try
	{
		strSQL.Format("select * from ComputerGroups where ParentComputerGroupid=%d",GroupID);
		hTRes = m_pGroupRecordset.CreateInstance(_T("ADODB.Recordset"));
		if (SUCCEEDED(hTRes))
		{
		     hTRes = m_pGroupRecordset->Open(strSQL.AllocSysString(),
			         _variant_t((IDispatch *)m_db,true),
					 adOpenStatic,adLockOptimistic,adCmdText);
			 if(SUCCEEDED(hTRes))
		     {
				if (!(m_pGroupRecordset->adoEOF))
				{
					m_pGroupRecordset->MoveFirst();
					while(!(m_pGroupRecordset->adoEOF))
					{
						InstallGroup(m_pGroupRecordset->GetCollect("ComputerGroupId").iVal, port, url,type);
						m_pGroupRecordset->MoveNext();
					}
				}
			 }
		}
	}
	catch(...)
	{
	}//end of try
	}//end of if


	strSQL.Format("select * FROM Computers where ComputerGroupId = %d",GroupID);
	_variant_t varSQLtcp(strSQL);
	try
	{
	    hTRes = m_pRecordset.CreateInstance(_T("ADODB.Recordset"));
		if (SUCCEEDED(hTRes))
		{
	        hTRes = m_pRecordset->Open(varSQLtcp,
			         _variant_t((IDispatch *)m_db,true),
					 adOpenStatic,adLockOptimistic,adCmdText);
            if(SUCCEEDED(hTRes))
	        {
				if (!(m_pRecordset->adoEOF))
				{
					m_pRecordset->MoveFirst();
					while(!(m_pRecordset->adoEOF))
					{
						CString  tempip;
						tempip=m_pRecordset->GetCollect("IpAddress").bstrVal;
						strcpy(IP,tempip.GetBuffer(0));
//						strcpy(IP,(char *)m_pRecordset->GetCollect("IpAddress").bstrVal);
						InstallKill(GroupID,IP,port,url);
						if (!(m_pRecordset->adoEOF))
							m_pRecordset->MoveNext();

					}
				}		
			}
		}
	}
	catch(...)
	{
		return;
	}
}



void CSocket_UdpServer::AddNewComputer(_ConnectionPtr Sdb,char * buf,int buflen)
{
	CString sqlStr;
	_CommandPtr Cmd1,Cmd2;
	_ParameterPtr Param1,Param2,Param3,Param4,Param5,Param6,Param7,Param8,Param9,Param10,Param11,Param12,Param13,Param14,Param15,Param16,Param17,Param18,Param19,Param20,Param21,Param22;
	char * fieldstart, * fieldend;
	CString  fieldstr;

//	CoInitialize(NULL);
//    Sdb.CreateInstance(__uuidof(Connection));
//    HRESULT hRes;
	try
	{
		fieldstart=buf;
		fieldend=strstr(fieldstart,",");

		Cmd1.CreateInstance( __uuidof( Command ) );
		Cmd1->ActiveConnection = Sdb;
		fieldstart=buf;
		fieldstr=fieldstart;
	
		sqlStr="insert into computers(ComputerId,ComputerGroupId,ComputerName,IpAddress,MacAddress,OsType,ServerPack,IEVersion,Langu,CpuType,CpuFreq,Memory,DiskSize,FreeDiskSize,KillVersion,isInstallKill,isRunKill,isRunComputer,isRegister,Cmd_Install,Cmd_Uninstall,IpAddressNum) ";
		sqlStr+=" values(10,2,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

/*
//为收到注册数据包服务的
*/
				VARIANT v;
				fieldend=strstr(fieldstart,",");
				*fieldend=0;
				fieldstr.Format("%s",fieldstart);
				fieldstart=fieldend+1;
				Param3 = Cmd1->CreateParameter("ComputerName",adBSTR,adParamInput,-1,fieldstr.AllocSysString() );
				fieldend=strstr(fieldstart,",");
				*fieldend=0;
				fieldstr.Format("%s",fieldstart);

⌨️ 快捷键说明

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