采用完成端口测试 .客户端发送大约33259左右字节之后..服务对止客户端SOCKET出现阻塞现像
lpContext->m_WriteBuffer.Write(strData); printf("Waiting for WRITE event\n");
WaitForSingleObject(lpContext->m_hWriteComplete, INFINITE);
printf("WaitForSingleObject*************************************\n");
//准备发送数据
lpContext->m_wsaOutBuffer.buf = lpContext->m_WriteBuffer.GetBuffer();
lpContext->m_wsaOutBuffer.len = lpContext->m_WriteBuffer.GetBufferLen();
LPOVERLAPPEDPLUS lpOverlap = AllocateOverlappedPlus(OP_IOWrite);
PostQueuedCompletionStatus(m_hIocp, 0, (DWORD) lpContext, &lpOverlap->ol);
屏幕打印完后
printf("Waiting for WRITE event\n");感觉好像挂起了...
lpContext->m_WriteBuffer.Write(strData); printf("Waiting for WRITE event\n");
WaitForSingleObject(lpContext->m_hWriteComplete, INFINITE);
printf("WaitForSingleObject*************************************\n");
//准备发送数据
lpContext->m_wsaOutBuffer.buf = lpContext->m_WriteBuffer.GetBuffer();
lpContext->m_wsaOutBuffer.len = lpContext->m_WriteBuffer.GetBufferLen();
LPOVERLAPPEDPLUS lpOverlap = AllocateOverlappedPlus(OP_IOWrite);
PostQueuedCompletionStatus(m_hIocp, 0, (DWORD) lpContext, &lpOverlap->ol);
屏幕打印完后
printf("Waiting for WRITE event\n");感觉好像挂起了...
ULONG ulFlags = MSG_PARTIAL; //删除已经发送了的数据
lpContext->m_WriteBuffer.Delete(dwIoSize);
if (lpContext->m_WriteBuffer.GetBufferLen()== 0)
{
//数据都发送了!
//清除缓存
lpContext->m_WriteBuffer.ClearBuffer();
// 写事件完成了,可以允许下次写了
SetEvent(lpContext->m_hWriteComplete); }
else
{
LPOVERLAPPEDPLUS pOverlap = AllocateOverlappedPlus(OP_IOWrite); lpContext->m_wsaOutBuffer.buf = lpContext->m_WriteBuffer.GetBuffer();
lpContext->m_wsaOutBuffer.len = lpContext->m_WriteBuffer.GetBufferLen(); int nRetVal = WSASend(lpContext->m_Socket,
&lpContext->m_wsaOutBuffer,
1,
&lpContext->m_wsaOutBuffer.len,
ulFlags,
&pOverlap->ol,
NULL);
if (nRetVal == SOCKET_ERROR && WSAGetLastError()!= WSA_IO_PENDING)
{
FreeClientContext(lpContext);
} }
在
BOOL bResult = GetQueuedCompletionStatus(pIocpServer->m_hIocp,
&dwNumRead,
(LPDWORD)&lpContext,
&lpOverlapped,
INFINITE);
之后
再WSASend .真正的发送???
是这样的机制吗.
还是GetQueuedCompletionStatus( 得到的是发送完成之后的操作
好像只是分配给你一个sock操作的机会吧...有没有人来啊