非阻塞SOCKET实现出问题了!!!

zhxhaixing 2005-07-26 04:56:18
WSAEVENT hSocketEvent = WSACreateEvent();
int nResult = WSAEventSelect(sock, hSocketEvent, FD_READ|FD_WRITE);
while (TRUE)
{
DWORD dwResult = WaitForSingleObject(hSocketEvent, 1000L);
if ((dwResult!=WAIT_OBJECT_0))
{
break;
}
接受数据。。。
if WSAEWOULDBLOCK


}
...全文
148 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhxhaixing 2005-07-26
  • 打赏
  • 举报
回复
完整非阻塞处理过程就是这些代码,有时候经常发现如果没有返回content_length就会,一直在WaitForSingleObject,并且一直不超时,就会造成一直在等
zhxhaixing 2005-07-26
  • 打赏
  • 举报
回复
int readsize, totalbytesread, Datasize, bytesread;
totalbytesread = 0;
Datasize = 0;
m_strHeader = "";
readsize = sizeof(DATAPACKAGE);
WSAEVENT hSocketEvent = WSACreateEvent();
int nResult = WSAEventSelect(sock, hSocketEvent, FD_READ|FD_WRITE);
if(nResult == SOCKET_ERROR)
{
#ifdef _DEBUG
MessageBox(NULL, "选择接收读写通知失败", "", MB_OK);
#endif
}
waitfor:
while (TRUE)
{
DWORD dwResult = WaitForSingleObject(hSocketEvent, 1000L);
if ((dwResult!=WAIT_OBJECT_0))
{
break;
}
if (readsize <= 0)
break;
while((!m_strHeader.empty() && readsize > 0) ||(m_strHeader.empty()))
{
if((bytesread = recv(sock, (char *)recvbuf + totalbytesread, readsize,
0)) == SOCKET_ERROR)
{
if (WSAGetLastError() != WSAEWOULDBLOCK)
{
return FALSE;
}
else
{
//错误可能是阻塞引起的,在这种情况下,我们也要循环调用recv接收,可
//能会造成CPU的消耗
goto waitfor;
}
}
totalbytesread += bytesread;
if (m_strHeader.empty())
{
m_strHeader = GetContentHeader(recvbuf);
if (!m_strHeader.empty())
{
Datasize = GetContentLength(m_strHeader);
if (Datasize == 0)
{
// Datasize = sizeof(DATAPACKAGE);
}
else
{
int nHeaderSize = m_strHeader.size();
readsize = Datasize - (totalbytesread - nHeaderSize);
continue;
}
}
}
readsize -= bytesread;
}
}
m_nRecvDataSize = totalbytesread;
WSACloseEvent(hSocketEvent);
return TRUE;
}
windcsn 2005-07-26
  • 打赏
  • 举报
回复
没有写完整
zhxhaixing 2005-07-26
  • 打赏
  • 举报
回复
if WSAEWOULDBLOCK
则去WaitForSingleObject

18,356

社区成员

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

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