首先服务端是一个win32console应用程序。
在建立项目的时候需要勾选MFC
套接字的初始化同客户端相似:
//对套接字进行初始化
WSADATA wsadata;
WORD ver = MAKEWORD(, );
WSAStartup(ver, &wsadata); SOCKET server;
server = socket(AF_INET, SOCK_STREAM, ); SOCKADDR_IN server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons();
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//接收来自所有ip地址的连接
然后进行绑定、监听、接收客户端连接的操作
//绑定
bind(server, (SOCKADDR*)&server_addr, sizeof(server_addr));
//监听
listen(server, );//最多可以监听10个连接 SOCKET client; //接收
while (true)
{
client = accept(server, , );
} system("pause");
return ;
while语句:如果不加的话,客户端连接依次,服务端就会关闭。 |
客户端的代码也需要做出相应修改,如果连接成功会进行一些操作(将状态栏文字修改为:connect succeed)
//在指定的套接字上进行连接
if(connect(server, (SOCKADDR*)&server_addr,sizeof(server_addr)) != )
{
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, , ) != INVALID_SOCKET)
{
//如果连接成功,会向客户端发送请求,(请求用户输入密码)
send(client, "Password", sizeof ("Password"), );
}
不过,信息也有可能发送失败,需要进行判断一下
//判断是否发送成功
if (send(client, "Password", sizeof ("Password"), ) != SOCKET_ERROR)
{
cout<<"有客户请求连接,等待客户输入密码..."<<endl;
}
接下来进行客户端的编写,客户端接收到Password时,会弹出一个输入密码的窗口,这个窗口需要自己创建
char Buff[]; //用来保存接收的数据
if (recv(server, Buff, sizeof(Buff), ) != SOCKET_ERROR)
{
//将接收到的数据和Password进行比较
if (strcmp(Buff, "Password") == )
{ }
}
设计完输入密码对话框,还需要添加到类里面,选择新建MFC类
类名写Password就好,基类选择CDialog,对话框选择刚刚创建的那个对话框的名称,然后确定
//将接收到的数据和Password进行比较
if (strcmp(Buff, "Password") == )
{
//弹出对话框
Password dlg;
dlg.DoModal();
}
现在来看一下运行效果
下面来对输入的密码进行传递及判断
服务端:
if (recv(client, password, sizeof(password), ) == SOCKET_ERROR)
{
cout<<"Connot receive client password"<<endl;
}
else
{
if (strcmp(password, "") == )
{
send(client, "TRUE", sizeof("TRUE"), );
cout<<"Password correct"<<endl;
}
else
{
send(client, "FALSE", sizeof("FALSE"), );
cout<<"Password incorrect"<<endl;
}
}
客户端:
else
{
GetDlgItem(IDC_STATIC)->SetWindowText("Waiting for verifying");
}
if (recv(server, Buff, sizeof(Buff), ) != SOCKET_ERROR)
{
if (strcmp(Buff, "TRUE") == )
{
MessageBox("Password correct");
GetDlgItem(IDC_STATIC)->SetWindowText("Password correct");
}
if (strcmp(Buff, "FALSE") == )
{
MessageBox("Password incorrect");
GetDlgItem(IDC_STATIC)->SetWindowText("Password incorrect");
}
}
由于输入密码和发送密码并不在一个类中,所以需要定义一个全局变量来保存密码