VC425 远程控制软件的设计控制远程按键C++
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
今天,许多企业和增值分销商正在把远程控制技术作为有效的技术支持工具,许多网络管理员都采用这类软件对局域网进行远程管理。远程管理软件对于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中的数据和资料。本文介绍的软件用C++语言编写而成,能通过一台主机控制网络上的一台或多台远程主机的键盘。软件采用了C/S模式,即客户端/服务器端模式。客户端对服务器端进行监控操作,服务器端接收客户端传输的数据并进行分析和执行。本文首先对远程控制软件的原理和WinSock技术作了介绍,最后阐述了如何利用 WinSock 控件与远程计算机建立连接,实现控制按键的功能。 [资料来源:http://www.THINK58.com]
远程控制软件已经使用很多年了,起初是为了让PC用户在离开办公室的时候能访问其台式PC硬盘中的信息,甚至可以通过其台式PC访问企业网络资源。今天,许多企业和增值分销商正在把远程控制能力作为有效的技术支持工具。许多网络管理员都采用这类软件对局域网进行管理或者在自己家更新自己网站的内容。这类软件对于出差在外的商务人员用处非常大,这样他们可以随时提取自己家里计算机中的数据和资料。
1.4 本课题的研究方法
本软件用C++语言编写,采用的是C/S结构,一个客户端,一个服务器端。客户端是控制端,服务器端是被控制端。主要功能就是通过本地计算机,控制远程另一台计算机的键盘。主要思路是先用Winsocket建立两边的连接,客户端向
〖本文来自:计算机毕业网 〗
远程控制软件可以为我们的网络管理工作做很多工作,以保证网络和计算机操作系统的安全。这类程序的监听功能,也是为了保证网络的安全而设计的,但是如果使用不当的话,就会出现很多的问题。为了达到远程控制的目的,就必须将这些软件隐蔽起来。例如有的远程控制软件为了不让用户发现而被删除,就采用了一些办法让自己隐蔽起来,使远程控制程序本身附着在某些Windows程序上,以增强驻留系统的可靠性。然而,正是由于这种功能,才使远程控制软件变得可怕起来,也使远程控制软件,病毒和黑客程序之间的区别变得越来越模糊。
think58好,好think58
2.2.1 远程控制与病毒的区别
计算机病毒是能通过某种途径潜伏在计算机存储介质(或程序)里,当达到某种条件时即被激活的具有对计算机资源进行破坏作用的一种程序或指令集合。计算机病毒一般具有破坏性,隐蔽性,潜伏性,传染性等特点。从计算机病毒的定义和特征中可以看出,远程控制软件与病毒的区别是十分明显的。最基本的区别就在于病毒有很强的传染性,而远程控制软件没有。但是,如果远程控制软件没有好的处理好软件的安全问题,就会跟病毒相差无几了。
内容来自think58 [来源:http://think58.com]
[资料来源:http://think58.com]
5 远程按键控制的实现
5.1 使用Winsocket建立控制端和被控制端连接
首先,客户端和服务器端都要创建一个数据套接字。接着,服务器调用bind()函数给套接字分配一个公认的端口。这样,客户端和服务器端就使用同样的端口来表示服务器套接字。一旦服务器将公认端口分配给了套接字,客户端和服务器端就都能使用sendto()和recvfrom()来发送和接收数据报直到完成传递。然后调用close socket来关闭套接字。
5.1.1 初始化Winsock
WSAStartup()函数的原型声明如下:
Int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData );
该函数共有两个参数。一个参数是一个WORD(双字节)型数值,他指应用程序中要使用的WinSock规范的最高版本。其中主版本在低位字节,副版本号在高位字节。第二个参数指一个指向WSDATA结构的指针,该结构的定义如下:
Typedef struct WSAData
{
WORD wVersion;
WORD wHighVersion;
Char szDescription[WSADESCRIPTION_LEN+1]; think58好,好think58 [资料来源:http://think58.com]
Char szSyestemStatus[WSASYS_ STATUS_LEN+1];
Unsigned short iMaxSocket;
Unsigned short iMaxUdpDg;
Char FAR * IpVendorInfo;
}WSADATA,FAR * LPWSADATA copyright think58 [资料来源:http://THINK58.com]
其中成员wVersion指Windows Sockets的版本号。
成员wHighVersion指Windows Sockets的最高版本。通常情况下,该成员的取值与成员wVersion相同。
成员szDescrpition指Windows Sockets实现的句柄字符串。
成员szSystemStatus指Windows Sockets的配置信息或相关状态。
成员iMaxSockets,iMaxUdpDg和lpVendorInfo保留;在Windows Socket2及以后的版本中被忽略。
我们一般采用如下代码来调用WSAStartup():
# include<winsocket.h>
//对应winSock 2,应该包含winsock2.h copyright think58 [资料来源:THINK58.com]
CScrollView::OnKeyUp(nChar, nRepCnt, nFlags);
}
oid CPeeperWnd::OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
GetEnableFlag(PL_ENABLE_KEY))
{
BYTE chTemp[15];
ZeroMemory(chTemp, 15);
memcpy(chTemp, &nChar, sizeof(UINT));
memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_DOWN);
if(nRet <= 0)
{
ExitConnect();
return ;
}
nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
return ;
}
CScrollView::OnSysKeyDown(nChar, nRepCnt, nFlags);
} copyright think58 [来源:http://www.think58.com]
void CPeeperWnd::OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
if(CanSend() && (((BYTE)nChar != VK_LWIN && (BYTE)nChar != VK_RWIN)) &&
GetEnableFlag(PL_ENABLE_KEY))
{
BYTE chTemp[15];
ZeroMemory(chTemp, 15);
memcpy(chTemp, &nChar, sizeof(UINT));
memcpy(chTemp+sizeof(UINT), &nFlags, sizeof(UINT));
int nRet = ::PL_SendSocketData(m_sckClient[0], chTemp, sizeof(int)*2, PL_KEY_UP);〖本文来自:计算机毕业网 〗
if(nRet <= 0)
{
ExitConnect();
return ;
}
nRet = ::PL_ReadSocketData(m_sckClient[0], chTemp, 2, NULL);
return ;
}
CScrollView::OnSysKeyUp(nChar, nRepCnt, nFlags);
}
向服务器发送数据:
int WINAPI PL_SendSocketData(SOCKET s, BYTE *chData, int nLen, BYTE chFlag, UINT uFlag)
{
int nRet = INVALID_SOCKET; think58好,好think58 [资料来源:http://THINK58.com]
if(s != INVALID_SOCKET)
{
char *chTemp = new char[nLen + 3];
ZeroMemory(chTemp, nLen + 3);
if(chFlag == PL_NONE) // only data
{
if(chData != NULL)
{
if(uFlag == MSG_OOB)
{
nLen += 1;
}
nRet = ::send(s, (char *)chData, nLen, uFlag);
}
else
{
nRet = 0;
}
}
else
{
chTemp[0] = chFlag;
if(chData != NULL)
{
memcpy(chTemp + 1, chData, nLen);
}
else
{
nLen = 0;
本文来自think58