📄 socket_udpserver.cpp
字号:
// 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 + -