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;
}
...全文
66 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
rularys 2010-01-14
  • 打赏
  • 举报
回复
你的 CallBackRcvCltData 里有没有重新投递接收?
xwsn007 2010-01-13
  • 打赏
  • 举报
回复
MARK & UP

18,356

社区成员

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

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