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

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

NB5.5采用的是客户端实现套接字监听,服务端通过套接字主动连接客户端的方式。首先介绍客户端套接字的处理流程。

1 StartListen()函数

客户端主界面类CNetBotDlg的成员函数StartListen()完成了套接字的创建、绑定和监听的工作。该函数的声明格式为

void StartListen(int Port);

函数的参数为套接字要监听的端口。

在该函数中创建线程用来创建、绑定和监听套接字。

2 ThreadAccept()线程函数

操作套接字的线程函数是ThreadAccept()函数。在该函数中,首先调用socket()bind()以及listen()函数完成套接字的用来创建、绑定和监听。用于监听的套接字是CNetBotDlg类的成员变量m_ListenSock

接下来使用while()循环来实现接收服务端连接的功能。

while(m_ListenSock != INVALID_SOCKET)

{

ClientSocket = accept(m_ListenSock, (LPSOCKADDR)&ClientAddr, &ClientAddr, &addr_size);

    //创建线程处理ClientSocket

}

由于当前套接字的模式是阻塞模式,如果没有服务端主动连接客户端,此时ThreadAccept()线程会在accept()函数处阻塞,直到有服务端连接,程序才会继续运行,去创建线程处理与服务端的通信。

3 AcceptSocket()线程函数

当有服务端连接客户端时,创建AcceptSocket()线程处理与服务端的通信。在该函数中首先接收来自服务端的数据。

RecvMsg(socket, chBuffer, &msgHead);

其中,socketAcceptSocket()线程函数的参数,即客户端用来与服务端通信的套接字;chBuffer中保存了从服务端收到的数据;msgHead中保存了数据的类型。之后,在AcceptSocket()线程函数中使用switch/case语句对从服务端收到的数据进行处理。

switch(msgHead.dwCmd)

{

   case SOCKET_CONNET://服务端基本信息

   break;

   case SOCKET_FILEMANAGE://服务端文件管理

   break;

   case SOCKET_SCREEN://服务端屏幕监控

   break;

   case SOCKET_PROCESS://服务端进程管理

   break;

   case SOCKET_CMDSHELL://服务端cmd Shell

   break;

   case SOCKET_FILEDOWN://服务端文件下载

   break;

   case SOCKET_FILEUP//服务端文件上传

   break;

   case SOCKET_VIDEOCAP://服务端视频捕捉

   break;

}

4 程序构造

 

0 0