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);
其中,socket是AcceptSocket()线程函数的参数,即客户端用来与服务端通信的套接字;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 程序构造