m_pwbuf->buf = m_szBuffer; //这句话的意思是不是说 将m_szBuffer 指针给了buf
m_pwbuf->len = MAX_BUFFER_LEN; //也就是说 实际上WSABUF里的数组指针指向的是m_szBuffer 实际接收的数据是 在m_szBuffer数组里 问题
微软决定要WSABUF为缓冲区参数
,buf要指向一块有效内存 因为 m_szBuffer 的生命周期和 m_pwbuf是一致的 所以那样。。
if (true == AssociateWithIOCP(pClientContext)) //请问这个关联操作会触发OP_READ 完成操作事件吗 问题1 ?????????
据我猜测是不会出发读操作的
//这里是接收一个字节 搞不懂为啥是一个字节 为啥 要接收难道我发送不行吗 问题2 ?????????
int nBytesRecv = WSARecv(pClientContext->GetSocket(), p_wbuf, 1,&dwBytes, &dwFlags, p_ol, NULL);
这里是投递一个读的IOCP请求到队列中 也就是说有数据会触发你上面说的OP_READ操作(但是看你代码貌似是设置OP_WRITE
)
pClientContext->SetOpCode(OP_WRITE); //如果发送的数据 大于总共要发送的 到这一步 设置开始接收数据 触发下一个事件
//为什么 没有没有关于WSARecv的 而且有也只有一个字节 难道接收只接收一个字节吗 问题 3?????????
pClientContext->ResetWSABUF(); //清空WSABUF结构
不是一个字节是一个WSABUF
pClientContext->GetBuffer(szBuffer); //接收到的字节 怎么接收的没说啊 为啥只接收了一个字节 接受一个缓冲区为啥就能打印不继续接收 难道 继续接收应该设置下面那个标志为 OP_WRITE //问题4??????
为什么只有一个字节我也不知道,不过你strcpy是很不负责任很危险的做法 小心堆栈溢出, 本次IO有多少字节不是 print(%s)说了算 是 dwBytesTransfered 说了算
是内核给你完成的,完成了给你的队列投递一个信息,然后你在Get出来, 和消息队列有一点点类似
继续接受关键是投递WSARecv操作到队列
记得点一下致谢