zoukankan      html  css  js  c++  java
  • VC远控(二)连接Server端及密码验证

    首先服务端是一个win32console应用程序。

    在建立项目的时候需要勾选MFC

    套接字的初始化同客户端相似:

        //对套接字进行初始化
        WSADATA wsadata;
        WORD ver = MAKEWORD(2, 2);
        WSAStartup(ver, &wsadata);
    
        SOCKET server;
        server = socket(AF_INET, SOCK_STREAM, 0);
    
        SOCKADDR_IN server_addr;
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(12345);
        server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//接收来自所有ip地址的连接

    然后进行绑定、监听、接收客户端连接的操作

        //绑定
        bind(server, (SOCKADDR*)&server_addr, sizeof(server_addr));
        //监听
        listen(server, 10);//最多可以监听10个连接
    
        SOCKET client;
    
        //接收
        while (true)
        {
            client = accept(server, 0, 0);
        }
    
        system("pause");
        return 0;
    while语句:如果不加的话,客户端连接依次,服务端就会关闭。

    客户端的代码也需要做出相应修改,如果连接成功会进行一些操作(将状态栏文字修改为:connect succeed)

        //在指定的套接字上进行连接
        if(connect(server, (SOCKADDR*)&server_addr,sizeof(server_addr)) != 0)
        {
            GetDlgItem(IDC_STATIC)->SetWindowText("Connect Failed ");
            MessageBox("Connect Failed !");
            GetDlgItem(IDC_STATIC)->SetWindowText("No Connection");
    
            return;
        }
        else
        {
            GetDlgItem(IDC_STATIC)->SetWindowText("Connect Succeed");
        }

    如果客户端成功的连接,服务端会向客户端发送输入密码的请求:

            //服务端正确的接收到了来自客户端的连接
            if (client = accept(server, 0, 0) != INVALID_SOCKET)
            {
                //如果连接成功,会向客户端发送请求,(请求用户输入密码)
                send(client, "Password", sizeof ("Password"), 0);
            }

    不过,信息也有可能发送失败,需要进行判断一下

                //判断是否发送成功
                if (send(client, "Password", sizeof ("Password"), 0) != SOCKET_ERROR)
                {
                    cout<<"有客户请求连接,等待客户输入密码..."<<endl;
                }

    接下来进行客户端的编写,客户端接收到Password时,会弹出一个输入密码的窗口,这个窗口需要自己创建

            char Buff[16];    //用来保存接收的数据
            if (recv(server, Buff, sizeof(Buff), 0) != SOCKET_ERROR)
            {
                //将接收到的数据和Password进行比较
                if (strcmp(Buff, "Password") == 0)
                {
    
                }
            }

    设计完输入密码对话框,还需要添加到类里面,选择新建MFC类

    类名写Password就好,基类选择CDialog,对话框选择刚刚创建的那个对话框的名称,然后确定

                //将接收到的数据和Password进行比较
                if (strcmp(Buff, "Password") == 0)
                {
                    //弹出对话框
                    Password dlg;
                    dlg.DoModal();
                }

    现在来看一下运行效果

    下面来对输入的密码进行传递及判断

    服务端:

                if (recv(client, password, sizeof(password), 0) == SOCKET_ERROR)
                {
                    cout<<"Connot receive client password"<<endl;
                }
                else
                {
                    if (strcmp(password, "123456") == 0)
                    {
                        send(client, "TRUE", sizeof("TRUE"), 0);
                        cout<<"Password correct"<<endl;
                    }
                    else
                    {
                        send(client, "FALSE", sizeof("FALSE"), 0);
                        cout<<"Password incorrect"<<endl;
                    }
                }

    客户端:

                    else
                    {
                        GetDlgItem(IDC_STATIC)->SetWindowText("Waiting for verifying");
                    }
                    if (recv(server, Buff, sizeof(Buff), 0) != SOCKET_ERROR)
                    {
                        if (strcmp(Buff, "TRUE") == 0)
                        {
                            MessageBox("Password correct");
                            GetDlgItem(IDC_STATIC)->SetWindowText("Password correct");
                        }
                        if (strcmp(Buff, "FALSE") == 0)
                        {
                            MessageBox("Password incorrect");
                            GetDlgItem(IDC_STATIC)->SetWindowText("Password incorrect");
                        }
                    }

    由于输入密码和发送密码并不在一个类中,所以需要定义一个全局变量来保存密码

  • 相关阅读:
    使用Vue.extend来动态创建组件
    SKU
    城市选择
    面试题整理
    清除本域名Cookies
    vue 使用腾讯IM即时通信
    路由重复加载报错的问题
    Vue 、H5音乐播放器播放音乐
    Android 开发实用方法大全
    Android 欢迎界面淡入效果并用WebView加载网址
  • 原文地址:https://www.cnblogs.com/zhangtingkuo/p/3403966.html
Copyright © 2011-2022 走看看