首先服务端是一个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"); } }
由于输入密码和发送密码并不在一个类中,所以需要定义一个全局变量来保存密码