012 双端网络某块的开发和准备

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("网络初始化失败");
    }
}
  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值