NetBots5.5代码分析之套接字模型2

来源:互联网 发布:数控冲床编程教程 编辑:程序博客网 时间:2024/05/19 04:26

NB5.5服务端是通过动态库文件实现的。通过svchost项目编译生成NBVip.libNBVip.dll文件,并将这两个文件拷贝到客户端的NetBot项目的文件夹中,以便客户端能够生成服务端。

接下来我们就看一下服务端的svchost动态库项目是如何连接客户端的。

1 RunningThread()线程的创建

动态库项目的入口函数是ServiceMain(),在该入口函数中有如下代码

HANDLE hThread = CreateThread(NULL, NULL, RunningThread, NULL, NULL, NULL);

创建了RunningThread()线程,在该线程中完成套接字的操作。

2 ConnectThread()线程的创建

RunningThread()线程中,while()循环语句中创建ConnectThread()线程,连接客户端。

while(1){   HANDLE hThread = CreateThread(NULL, NULL, ConnectThread, NULL, NULL, NULL);   WaitForSingleObject(hThread, INFINIT);}

从以上代码中可以看出,当创建了ConnectThread()线程去连接客户端之后,程序会在WaitForSingleObject()函数处阻塞,直到客户端断开了与服务端的操作后,程序才继续运行,通过while()语句循环,再次创建ConnectThread()线程去连接客户端。

3 ConnectThread()线程

ConnectThread()函数中,首先调用socket()函数创建与客户端通信的套接字,之后调用connect()函数去连接客户端。由于此时套接字是阻塞模式,直到客户端接收了服务端的连接之后,程序才继续运行,否则程序会阻塞在connect()函数处。

接下来服务端获取系统的信息,包括操作系统版本号、内存、计算机名等,并将这些信息通过套接字发送给客户端。

SendMsg(chBuffer, &m_SysInfo, sizeof(SysInfo));

其中,chBuffer是本机系统信息,m_SysInfo表示发送数据的类型。

4 程序结构

 

0 0