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

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

转载于:https://my.oschina.net/zhangtingkuo/blog/390070

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值