iocp聊天程序,接收数据包包体时,加个断点再执行没有关问题,去掉断点直接运行就接收数据出错
iocp聊天程序,接收数据包包体时,加个断点再执行没问题,去掉断点直接运行就接收数据出错?
遇到的情况如题,加断点的那段代码如下:
传入参数nLen = 11132
OOL CClient::AsyncRecvBody(int nLen)
{
DWORD flags = 0;
DWORD recvBytes = 0; //此处加个断点
ZeroMemory(&m_iIO, OVERLAPPEDPLUSLEN);
m_iIO.type = IOReadBody;
WSABUF wsaBuf;
wsaBuf.buf = m_iIO.recvBuf; //接收包体
wsaBuf.len = nLen; //缓冲区长度
//读取数据
if (WSARecv(m_s,
&wsaBuf,
1,
&recvBytes,
&flags,
&m_iIO.overlapped,
NULL) == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
AfxMessageBox(_T("WSARecv body is error!"));
return FALSE;
}
}
return TRUE;
}
如上代码,当在DWORD recvBytes = 0;处加上断点时,下面WSARecv读取到的字符个数就是传入的nLen长度,
但当我把这个断点取消直接执行程序的时候,下面WSARecv读取到的字符个数却总是1428这个值。
请问为什么会这样子?谢谢!
------解决方案--------------------
这可能跟传输过程有关,我想你用的是TCP/IP协议。
在传输过程中,发送端和网络路由等设备可能将原本很大的数据包拆分成多个小的数据包,在网络上传输。
你设了断点,实际上就在断点处等待了一段时间,这段时间里有新的数据包到达缓冲区,所示在调用WSARecv时就同时把缓冲区里的数据取出。
没有断点,运行的很快没有等到所有的数据到达就取数据了,所以长度就断。
不过你这个是iocp吗?我觉得更像opverlappedIO,可能是我水平低没看出来。
------解决方案--------------------
GetQueuedCompletionStatus 返回的时候,数据已经在你的缓冲区里面了
IOCP麻烦的根源
顺序是
线程1: 系统线程: 线程2:
WSARecv(buf); -----> WaitData(); GetQueuedCompletionStatus
函数返回 memcpy(buf, data); 线程2阻塞中
WakeupIocp(); ----> 函数返回,继续运行
---------------------------------------
也就是线程2继续运行的时候,数据已经在线程1所持有的buf里面了。
遇到的情况如题,加断点的那段代码如下:
传入参数nLen = 11132
OOL CClient::AsyncRecvBody(int nLen)
{
DWORD flags = 0;
DWORD recvBytes = 0; //此处加个断点
ZeroMemory(&m_iIO, OVERLAPPEDPLUSLEN);
m_iIO.type = IOReadBody;
WSABUF wsaBuf;
wsaBuf.buf = m_iIO.recvBuf; //接收包体
wsaBuf.len = nLen; //缓冲区长度
//读取数据
if (WSARecv(m_s,
&wsaBuf,
1,
&recvBytes,
&flags,
&m_iIO.overlapped,
NULL) == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
AfxMessageBox(_T("WSARecv body is error!"));
return FALSE;
}
}
return TRUE;
}
如上代码,当在DWORD recvBytes = 0;处加上断点时,下面WSARecv读取到的字符个数就是传入的nLen长度,
但当我把这个断点取消直接执行程序的时候,下面WSARecv读取到的字符个数却总是1428这个值。
请问为什么会这样子?谢谢!
------解决方案--------------------
这可能跟传输过程有关,我想你用的是TCP/IP协议。
在传输过程中,发送端和网络路由等设备可能将原本很大的数据包拆分成多个小的数据包,在网络上传输。
你设了断点,实际上就在断点处等待了一段时间,这段时间里有新的数据包到达缓冲区,所示在调用WSARecv时就同时把缓冲区里的数据取出。
没有断点,运行的很快没有等到所有的数据到达就取数据了,所以长度就断。
不过你这个是iocp吗?我觉得更像opverlappedIO,可能是我水平低没看出来。
------解决方案--------------------
GetQueuedCompletionStatus 返回的时候,数据已经在你的缓冲区里面了
IOCP麻烦的根源
顺序是
线程1: 系统线程: 线程2:
WSARecv(buf); -----> WaitData(); GetQueuedCompletionStatus
函数返回 memcpy(buf, data); 线程2阻塞中
WakeupIocp(); ----> 函数返回,继续运行
---------------------------------------
也就是线程2继续运行的时候,数据已经在线程1所持有的buf里面了。