在改造客户端为select网络模型的时候,由于C++的标准输入流函数cin是阻塞函数,因此暂时将其删掉。
本节引入线程,与主线程分离的处理客户端的输入命令逻辑业务。
编写一个函数,用于客户端循环输入命令,并send给服务端处理。
bool g_bRun = true; //全局变量,用于控制客户端程序是否结束,如果这个值是false,那么主线程应该结束运行。因此,主线程中,循环进行select函数的代码段编程了 while (g_bRun){......}
void cmdThread(SOCKET _sock)
{
while (true)
{
// 3 输入请求命令
char cmdBuf[128] = {};
cout << "输入命令: ";
cin >> cmdBuf;
// 4 处理请求
if (strcmp(cmdBuf, "exit") == 0)
{
cout << "退出cmdThread线程" << endl;
g_bRun = false;
return;
}
else if (0 == strcmp(cmdBuf, "login"))
{
Login _login;
strcpy(_login.userName, "Evila");
strcpy(_login.Password, "Evila_Password");
// 5 向服务器发送请求命令
send(_sock, (const char*)&_login, _login.dataLength, 0);
}
else if (0 == strcmp(cmdBuf, "logout"))
{
Logout _logout;
strcpy(_logout.userName, "Evila");
//5 向服务器发送请求命令
send(_sock, (const char*)&_logout, _logout.dataLength, 0);
}
else
{
cout << "不受支持的命令" << endl;
}
}
return;
}