操作系统与网络 2019-4-1

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

				// 把连接成功的socketClient交给完成端口
				::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");

				// 把连接成功的socketClient交给完成端口
				::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 库的权限;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值