1.继续 IOCP 完成端口
1.1 完成线程处理函数
- 1.我们需要使用函数 GetQueuedCompletionStatus 来观察 完成端口 的 完成队列 的状态,因此提前定义好需要的变量: DWORD dw_recv_size = 0; ; ULONG_PTR u_key = 0 ; MyOverlapped* p_mol = 0 ;
- 2.在循环中查看 完成队列 的状态;
- 3.若 p_mol 的网络状态为 NET_ACCEPT ,将连接成功的套接字交给 完成端口 处理,并投递一个新的连接请求,一个新的接收数据请求;
unsigned int _stdcall IOCPNet::ThreadProc(LPVOID lpVoid)
{
IOCPNet* p_this = (IOCPNet*)lpVoid;
DWORD dw_recv_size = 0;
ULONG_PTR u_key = 0;
MyOverlapped* p_mol = 0;
while (p_this->m_bQuitFlag)
{
if(::GetQueuedCompletionStatus(p_this->m_hIOCP, &dw_recv_size, &u_key, (LPOVERLAPPED*)&p_mol, INFINITE) == TRUE)
{
if(p_mol->net == NET_ACCEPT)
{
TRACE("客户端连接成功!\n");
::CreateIoCompletionPort((HANDLE)p_mol->socketClient, p_this->m_hIOCP, p_mol->socketClient, 0);
p_this->PostAccept();
p_this->PostRecv(p_mol);
}
if(p_mol->net == NET_READ)
{
}
if(p_mol->net == NET_WRITE)
{
}
}
}
return 0;
}
1.2 完成 PostRecv 函数
bool IOCPNet::PostRecv(MyOverlapped* p_mol)
{
p_mol->net = NET_READ;
WSABUF wb;
wb.buf = p_mol->szBuffer;
wb.len = BUFFER_SIZE;
DWORD dw_recv_size = 0;
DWORD lp_flag = 0;
if(FALSE == WSARecv(p_mol->socketClient, &wb, 1, &dw_recv_size, &lp_flag, &(p_mol->ol), 0))
{
int n_code = WSAGetLastError();
if(n_code != ERROR_IO_PENDING)
{
return false;
}
}
return true;
}
1.3 在线程处理函数中,若信号是 NET_READ ,则进行输出,并投递新的连接请求
unsigned int _stdcall IOCPNet::ThreadProc(LPVOID lpVoid)
{
IOCPNet* p_this = (IOCPNet*)lpVoid;
DWORD dw_recv_size = 0;
ULONG_PTR u_key = 0;
MyOverlapped* p_mol = 0;
while (p_this->m_bQuitFlag)
{
if(::GetQueuedCompletionStatus(p_this->m_hIOCP, &dw_recv_size, &u_key, (LPOVERLAPPED*)&p_mol, INFINITE) == TRUE)
{
if(p_mol->net == NET_ACCEPT)
{
TRACE("客户端连接成功!\n");
::CreateIoCompletionPort((HANDLE)p_mol->socketClient, p_this->m_hIOCP, p_mol->socketClient, 0);
p_this->PostAccept();
p_this->PostRecv(p_mol);
}
if(p_mol->net == NET_READ)
{
TRACE(p_mol->sz_buffer);
p_this->PostRecv(p_mol);
}
if(p_mol->net == NET_WRITE)
{
}
}
}
return 0;
}
2.数据库MySQL
2.1 添加新的 模式(Schema),类似于vs里的项目
- 1.在 Navigator 里的空白处右键,create new schema;
- 2.模式的名字为Student;
2.2 添加新的 table
- 1.选中 Student 里的 table ,右键->create table…
- 2.创建 table 时里面有许多选项(对于数据来说);
2.3 创建新的用户
- 1.鼠标放到 Student 表上,右侧会有三个按钮,分别是 表格信息、设置表格、编写代码;
- 2.我们选择第三项点击进入;
- 3.在里面写上: create user Hello identified by ‘123456’; (意思是创建一个名为 Hello 的密码为 123456 的用户);
- 4.修改密码: alter user Hello identified by ‘nihao’ ;
2.4 可以选中某一行,点击 闪电 按钮,即只执行当前选中的代码;
2.5 删除用户: drop user Hello ;
2.6 给用户某些权限
- 1.grant select on Student to Hello ;
- 2.上述代码是给 Hello 用户一个查看 Student 库的权限;
2.7 撤销权限
- 1.revoke select on Student from Hello ;
- 2.上述代码是给 Hello 用户取消一个查看 Student 库的权限;