VC远控(二)连接Server端及密码验证

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

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

VC远控(二)连接Server端及密码验证

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

    //对套接字进行初始化
    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语句:如果不加的话,客户端连接依次,服务端就会关闭。

VC远控(二)连接Server端及密码验证

客户端的代码也需要做出相应修改,如果连接成功会进行一些操作(将状态栏文字修改为: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");
    }

VC远控(二)连接Server端及密码验证

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

        //服务端正确的接收到了来自客户端的连接
        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)
            {

            }
        }

VC远控(二)连接Server端及密码验证

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

VC远控(二)连接Server端及密码验证

VC远控(二)连接Server端及密码验证

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

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

现在来看一下运行效果

VC远控(二)连接Server端及密码验证

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

服务端:

            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");
                    }
                }

VC远控(二)连接Server端及密码验证

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