VC415 机房监控系统的设计Socket+VC++
1.无需注册登录,支付后按照提示操作即可获取该资料.
2.资料以网页介绍的为准,下载后不会有水印.资料仅供学习参考之用.
密 惠 保
鉴于这种情况,现在许多学校都提供了微机室,让在校学生可以很好的学习计算机操作,并使用计算机辅助学习。对于同学们来说,这本来是个很好的机会,但有个别同学未能珍惜这个机会,他们没有好好利用这些微机进行学习和研究,而是在机房内打游戏或者闲聊等,甚至有人利用电脑进行违反法规的活动。这些同学不但浪费了自身的学习机会,同时也浪费了学校的宝贵资源,而且给周围的同学造成了很不好的影响。因此,如何对机房进行有效的管理成为了一个不容忽视的问题。〖本文来自:计算机毕业网 〗
对于机房管理,一方面应该设立专门的管理员,拟定详细的机房使用规则;另一方面,也应该配备强大的管理软件,辅助管理员进行管理。因此,如何设计和实现机房监控系统成为了本次课题的研究问题。
1.2内容介绍
文章在第二章介绍了一些基本的技术原理,涉及到TCP/IP协议、Socket技术、Win32编程等概念,这些都是实现机房监控系统的基础技术。在第三章,首先讨论了机房监控系统应该具备哪些功能,接着设计出了服务器端和客户端器的通信协议。在第四章,首先讲述了用户界面的实现,接着着重介绍了几个核心技术的实现,包括如何对某个特定客户端进行屏幕截图,如何锁定指定客户端的屏幕以及如何在服务器端和客户端的进行通信。 内容来自think58 [资料来源:THINK58.com]
在Internet内部,从主机传送到主机的信息不是一个恒定的流,而是把数据分解成小包,即数据包。例如你要发一分很长的电子邮件(E-mail)给一位朋友,TCP就将该信息分成很多个数据包,每一个数据包用一序号和接收地址来标记。此外TCP还插入一些纠错信息。接着数据包被传过网络,即把它们传送给远程的主机这就是IP的工作。在另一端TCP接收数据并检查错误。如果有错误发生,TCP就可以要求重发信息。换句话说,IP的工作是把原始数据(数据包)从一端传送到另一端;TCP的工作就是管理这种流动并确保其数据是正确的。把数据分解成数据包有很多的好处。首先,它允许Internet让很多不同的用户在同一时间用同一通讯线路。因为这些数据包不必一起输送,所以通讯线路可以载着所有类型的数据包按它们自己的路径从一地到另一地。就如同一条高速公路上,各类汽车(即使它们开向不同的地方)都在公共道路上行驶。当数据包传输时,它们沿规定的路由从主机到主机,一直到它们到达最终目的地。这意味着Internet很 [版权所有:http://think58.com]
TCP/IP应用程序使用的应用层接口有Windows套接字(Winsock)、NetBIOS等。Windows套接字提供Windows下的标准应用编程接口;NetBIOS是工业标准接口,用于访问协议服务,如会话、数据报和名字解析等。
Internet 的核心层是网络层和传输层,相应的核心协议是IP协议和TCP协议。IP 协议的主要功能包括无连结数据报传送﹑数据报寻径以及差错处理三部分。IP协议的特点是点到点的,IP对等实体间的通信不经过中间机器,对等实体所在的机器位于同一物理网络,对等机器之间有直接的物理连接。IP层的主要功能是屏蔽下面物理层的差别,向上一层提供一致的数据格式。所有要传输的数据,被按照一定的格式分组封装层IP数据报,数据报单元通过寻径等机制进行传输,在接收方数据报进行重组,得到最初要传送的数据。由于IP协议是不可靠的数据传输协议,由于网络的拥塞而发生的数据丢失等情况是不可避免的,因此Internet 还必须有一定的控制重传机制,这就是差错与控制报文协议(ICMP)。 [资料来源:www.THINK58.com]
本文在软件实现上使用的Socket函数正是Windows Socket API。下面介绍几个重要的API:
一) WSAStartup函数
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明副版本、低位字节指明主版本;操作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。该函数执行成功后返回0。
例:假如一个程序要使用2.1版本的Socket,那么程序代码如下
wVersionRequested = MAKEWORD( 2, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
二) WSACleanup函数
int WSACleanup (void);
[来源:http://think58.com]
addrlen=sizeof(ServerSocketAddr);
ServerSocket=accept(ListenSocket,(struct sockaddr *)&ServerSocketAddr,&addrlen);
十) connect函数
int connect( SOCKET s, const struct sockaddr FAR *name, int namelen );
客户程序调用connect函数来使客户Socket s与监听于name所指定的计算机的特定端口上的服务Socket进行连接。如果连接成功,connect返回0;如果失败则返回SOCKET_ERROR。下面是一个例子:
struct sockaddr_in daddr;
memset((void *)&daddr,0,sizeof(daddr));
daddr.sin_family=AF_INET;
daddr.sin_port=htons(8888);
daddr.sin_addr.s_addr=inet_addr("133.197.22.4");
connect(ClientSocket,(struct sockaddr *)&daddr,sizeof(daddr));
本文来自think58
[来源:http://think58.com]
[资料来源:http://www.THINK58.com]
class CServer
{
public:
bool Check(char* name, char* pass);
bool UnlockScreen(char* ip);
bool LockScreen(char* ip);
bool SendMsg(char* ip, char* msg);
CString GetNextClientIP();
void PreEnum();
bool SnapScreen(char *ip, CxImage& x);
void AliveAll();
void AddClient(const Client &client);
void Run();
CServer()
{
InitializeCriticalSection(&cs);
};
~CServer()
{
DeleteCriticalSection(&cs);
closesocket(srvsock);
WSACleanup();
};
BOOL Init(int port);
private:
static DWORD WINAPI ListenThreadPrc(LPVOID lpParam);
SOCKET srvsock;
SOCKADDR_IN srvaddr;
vector<Client> clients;
CRITICAL_SECTION cs;
int pos;
};
class CClient
{
private:〖本文来自:计算机毕业网 〗
SOCKET local;
内容来自think58
sockaddr_in remote_addr;
int remote_addr_len;
HWND hWnd;
BOOL bLocked;
public:
BOOL bConnected;
bool UnlockScreen();
bool LockSrceen();
static DWORD WINAPI ResponseThreadPrc(LPVOID lpParam);
void Run();
CClient()
{
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2),&wsaData);
remote_addr_len=sizeof(remote_addr);
local=INVALID_SOCKET;
bLocked = FALSE;
bConnected = FALSE;
};
~CClient()
{
closesocket(local);
WSACleanup();
};
void Attach(HWND hWnd){this->hWnd=hWnd;};
bool Connect(char* ip, int port, char* name, char* pass);
};
内容来自think58 [版权所有:http://think58.com]