WSAAccept WSARecv WSASend 后,再也收不到 OP_IORead 了?

ruoge2007 2010-01-13 07:12:07
完成端口, 服务端 WSAAccept 客户端 后,投递 WSARecv, 收到 OP_IORead ,然后再 WSASend ,再也收不到 OP_IORead 了?
关键代码:

DWORD WINAPI ServerWorkerThread( LPVOID pData)
{
CListenSocket* pListen = (CListenSocket*) pData;
DWORD BytesTransferred;
LPWSAOVERLAPPED lpOverlapped = NULL;
PPER_HANDLE_DATA lpPerHandleData = NULL;
PPER_IO_DATA lpPerIOData = NULL;
DWORD SendBytes, RecvBytes;
DWORD Flags;
int rc;
BOOL bRun = TRUE;
BOOL bRst = FALSE;
while( bRun )
{
bRst = GetQueuedCompletionStatus( pListen->m_hIOCP, &BytesTransferred,
(LPDWORD)&lpPerHandleData, (LPOVERLAPPED *)&lpPerIOData,
INFINITE);
if ( bRst == FALSE )
{
if ( lpPerIOData == NULL)
{
AfxTrace( "aaa GetQueuedCompletionStatus failed with unknown error ????????? \n");
return -1;
}
rc = GetLastError();
AfxTrace( "bbb GetQueuedCompletionStatus failed with error %d\n", rc);
CallBackClntRemove( lpPerHandleData->hSocket);
continue;
}
if(BytesTransferred == 0 )
{
rc = GetLastError();
AfxTrace( "ccc GetQueuedCompletionStatus failed with error %d\n", rc);
CallBackClntRemove( lpPerHandleData->hSocket );
continue;
}

switch(lpPerIOData->opType)
{
case OP_IORead:
lpPerIOData->nDataF = BytesTransferred;
CallBackRcvCltData( lpPerHandleData, lpPerIOData);
break;
case OP_IOWrite:
lpPerIOData->nDataF = BytesTransferred;
CallBackWriteData( lpPerHandleData, lpPerIOData);
break;
case OP_IOCLNTCLOSE:
CallBackClntRemove( lpPerHandleData->dwIP);
break;
case OP_IOCLOSE:
AfxTrace("case OP_IOCLOSE:");
bRun = FALSE;
break;
default:
{
AfxTrace( "xxxxxxxxxxxxxx err ");
}
break;
}
}
return 0;
}

int CClientSocket::WSARecvFunc()
{
//start receive ...
int nRst = SOCKET_ERROR;
EnterCriticalSection( &m_sPerHandleData.rCriSec);
//if ( m_sPerHandleData.hSocket != INVALID_SOCKET)
{
DWORD Flags = 0;
DWORD nRecvBytes =0;
m_sPerIODataR.opType = OP_IORead;
m_sPerIODataR.bufData.len = MAX_PACKSIZE;
ZeroMemory(&(m_sPerIODataR.ol), sizeof(OVERLAPPED));
if (WSARecv( m_sPerHandleData.hSocket, &(m_sPerIODataR.bufData), 1, &nRecvBytes, &Flags,
&(m_sPerIODataR.ol), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
AfxTrace( "WSARecv() failed with error %d \n", WSAGetLastError());
nRst = SOCKET_ERROR;
goto labelRetn;
}
}
nRst = nRecvBytes;
}
labelRetn:
LeaveCriticalSection( &m_sPerHandleData.rCriSec);
return nRst;
}

int CClientSocket::WSASendFunc( BYTE* lpData, int nLen)
{
AfxTrace( "WSASendFunc \n");
int nRst = SOCKET_ERROR;
EnterCriticalSection( &m_sPerHandleData.sCriSec);
//if ( m_sPerHandleData.hSocket != INVALID_SOCKET)
{
DWORD nSendBytes;
m_sPerIODataS.opType = OP_IOWrite;
//m_sPerIODataS.bufData.len = m_sPerIODataS.nDataR;//MAX_PACKSIZE;
ZeroMemory(&(m_sPerIODataS.ol), sizeof(OVERLAPPED));
WaitForSingleObject( m_sPerHandleData.sEvent, INFINITE);
int nLeftData;
int nSendData;
nSendData = 0;
nLeftData = nLen+4;
*(DWORD*)(&m_sPerIODataS.bufData.buf[0]) = LEN_DW + nLen;
nSendData += 4;
nLeftData -= 4;
//first times
if ( nLeftData <= MAX_PACKSIZE )
{
memcpy( m_sPerIODataS.bufData.buf+nSendData, lpData, nLeftData);
nSendData += nLeftData;
nLeftData = 0;
m_sPerIODataS.bufData.len = nSendData;
}
else
{
memcpy( m_sPerIODataS.bufData.buf + nSendData, lpData, MAX_PACKSIZE-LEN_DW);
lpData += MAX_PACKSIZE-LEN_DW;
nSendData += MAX_PACKSIZE-LEN_DW;
nLeftData = nLeftData - (MAX_PACKSIZE-LEN_DW);
m_sPerIODataS.bufData.len = nSendData;
}
if (WSASend( m_sPerHandleData.hSocket, &( m_sPerIODataS.bufData), 1, &nSendBytes, 0, &(m_sPerIODataS.ol), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
AfxTrace( "000000 WSASend() failed with error %d %d\n", m_sPerHandleData.dwIP, WSAGetLastError());
nRst = SOCKET_ERROR;
goto labelRetn;
}
}
ResetEvent( m_sPerHandleData.sEvent);
//other
while ( nLeftData > 0)
{
WaitForSingleObject( m_sPerHandleData.sEvent, INFINITE);
ZeroMemory(&(m_sPerIODataS.ol), sizeof(OVERLAPPED));
if ( (nLeftData ) <= MAX_PACKSIZE )
{
memcpy( m_sPerIODataS.bufData.buf, lpData, nLeftData);
nLeftData = 0;
m_sPerIODataS.bufData.len = nLeftData;
}
else
{
memcpy( m_sPerIODataS.bufData.buf , lpData, MAX_PACKSIZE);
nLeftData = nLeftData - MAX_PACKSIZE;
m_sPerIODataS.bufData.len = MAX_PACKSIZE;
lpData += MAX_PACKSIZE;
}
nLeftData = nLeftData - MAX_PACKSIZE;
if (WSASend( m_sPerHandleData.hSocket, &( m_sPerIODataS.bufData), 1, &nSendBytes, 0, &(m_sPerIODataS.ol), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
AfxTrace( "000000 WSASend() failed with error %d %d\n", m_sPerHandleData.dwIP, WSAGetLastError());
nRst = SOCKET_ERROR;
goto labelRetn;
}
}
ResetEvent( m_sPerHandleData.sEvent);
}
nRst = nSendBytes;
}
labelRetn:
LeaveCriticalSection( &m_sPerHandleData.sCriSec);
return nRst;
}
...全文
130 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rularys 2010-01-14
  • 打赏
  • 举报
回复
你的 CallBackRcvCltData 里有没有重新投递接收?
xwsn007 2010-01-13
  • 打赏
  • 举报
回复
MARK & UP
源码下载地址: https://pan.quark.cn/s/40677b766bda "ContextCapture 倾斜摄影快速、创新及全面空三建模与单机集群硬件部署方案2018" 此资源聚焦于倾斜摄影(ContextCapture)空三建模及单机集群硬件部署方案,致力于为用户呈现最快、最优成本效益的台式工作站、移动工作站、并行集群的多样化部署选择。以下是该资源的详细知识点概述: 一、相关设备型号说明 * UltraLAB 是西安坤隆计算机科技有限公司推出的专属图形工作站品牌,具备三大卓越优势:顶尖的计算硬件架构、精准的行业应用定制服务、专业的硬件系统优化工艺。 二、硬件部署方案 * 台式工作站部署建议:设备特色在于当前市场上最快的台式计算架构,适用于办公场景下,部门层级常规的倾斜摄影空三处理、三维建模。 * 便携式工作站部署建议:设备特色在于当前市场上最快的移动计算架构,适用于移动倾斜摄影的空三处理、三维建模工作站。 * 大数据量处理工作站推荐:设备特色在于极限自动超频加速与16个并行存储构造,具备空三处理和三维建模最强的计算性能及海量高速并行存储性能。 * 多设备并行计算集群部署建议:针对海量图像数据计算产生的巨大需求,单机计算能力处理时间过长,效率不高,通过多台机器并行集群,进行空三处理、三维建模,显著减少处理时间。 三、部署方案深入解析 * 2.1 倾斜摄影建模(台式工作站)部署方案:设备特色在于最高的计算处理能力~6核5.2GHz,内存最大配置可达64GB,配备最新图灵架构的RTX显卡,相比市场其他品牌机器(单CPU、双Xeon处理器)更快、更具成本效益。 * 2.2 倾斜摄影建模(移动便携式工作站)硬件部署方案:设备特色在于最高的计算处理能力~6...

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧