1 TCP短连接和长连接
短连接:要发数据的时候才连接,接收到返回数据后就close,反复这个过程
适合场景:小量数据
长连接:
client连接到server就不中断,一直连接
好处:每一次收发数据省了一个连接的过程
适合场景:适合大量数据分发(一秒钟以内有个三次以上的数据收发)
远程控制:
大部分和服务器之间是没有数据收发的
而且我们这个是远程控制,目标的状态是不可知的,我们可以通过connect来判断目标机器状态
2 再次优化服务端程序最外层架构
参考代码
-
main函数里面添加了ExcuteCommand函数结构,用于执行命令,简化main函数
-
CServerSocket类里面添加GetPacket接口,获取包数据
-
CServerSocket类里面添加CloseSocket,用于关闭客户端套接字
1 最外层架构
最外层架构一定要清晰
while (CServerSocket::getInstance() != NULL) { if (pserver->AcceptClient() == false) { MessageBox(NULL, _T("接入用户失败,自动重试"), _T("接入用户失败!!"), MB_OK | MB_ICONERROR); acceptCount += 1; if (acceptCount >= 3) { MessageBox(NULL, _T("多次用户失败,退出程序"), _T("多次接入用户失败!!"), MB_OK | MB_ICONERROR); exit(0); } } int cmd = pserver->DealCommand(); if (cmd > 0) { int ret = ExcuteCommand(cmd); if (ret != 0) { TRACE("执行命令失败:cmd :%d, ret :%d", cmd, ret); } // 短连接 pserver->CloseSocket(); } }
2 ExcuteCommand函数
int ExcuteCommand(int nCmd) { int ret = 0; switch (nCmd) { case 1:// 获取磁盘分区 ret = MakeDriverInfo(); break; case 2:// 获取指定目录下的文件信息 ret = MakeDirectoryInfo(); break; case 3:// 打开文件 ret = RunFile(); break; case 4:// 下载文件 ret = DownloadFile(); break; case 11:// 鼠标事件 ret = MouseEvent(); break; case 12:// 发送屏幕--》本质发送屏幕截图 ret = SendScreen(); break; case 13: // 锁机 ret = LockMachine(); break; case 14: // 解锁 ret = UnlockMachine(); break; } return ret; }
3 GetPacket
CPacket& GetPacket() { return m_packet; }
4 CloseSocket
void CloseSocket() { closesocket(m_socket_client); m_socket_client = INVALID_SOCKET; }
3 客户端
3.1 客户端添加了一个测试按钮
测试按钮用于测试网络连通性
代码如下:
void CRemoteClientDlg::OnBnClickedBtnTest() { CClientSocket* pClient = CClientSocket::getInstance(); bool ret = pClient->InitSocket("127.0.0.1"); if (!ret) { AfxMessageBox("网络初始化失败"); } }