udp服务器使用重叠模型WSARecvfrom在调用大约800多次后出现10055(缓冲不足)错误,如何解决?
之间几乎没做任何事情
大概的代码
DWORD WINAPI RecvThreadFunc(LPVOID lpParam)
{
VLServerBase* vlserv = (VLServerBase*) lpParam;
SOCKADDR_IN clientAddr_in;
int iaddrlength = sizeof(SOCKADDR_IN);
int iRet;
char buffer[DATA_BUFSIZE];
ZeroMemory(buffer,DATA_BUFSIZE);
//先初始化一个event
WSAEVENT hEvent = WSACreateEvent();
vlserv->m_iSockIndex = vlserv->GetInvidEventIndex();
vlserv->EventArray[vlserv->m_iSockIndex] = hEvent;
ZeroMemory(&(vlserv->AcceptOverlapped[vlserv->m_iSockIndex]), sizeof(WSAOVERLAPPED));
vlserv->AcceptOverlapped[vlserv->m_iSockIndex].hEvent = vlserv->EventArray[vlserv->m_iSockIndex];
vlserv->DataBuf[vlserv->m_iSockIndex].len = DATA_BUFSIZE;
vlserv->DataBuf[vlserv->m_iSockIndex].buf = buffer;
vlserv->m_dwFlag = 0;
for(int i = 0;;i++)
{
if(vlserv->m_iEventTotal >= WSA_MAXIMUM_WAIT_EVENTS)
{
continue;
}
iRet = WSARecvFrom(
vlserv->m_servSock, // Socket
&(vlserv->DataBuf[vlserv->m_iSockIndex]), // WSABUF
1, // Number of buffers
&(vlserv->m_dwRevbBytes), // Bytes received
&(vlserv->m_dwFlag), // Flags
(sockaddr* )&clientAddr_in, //(vlserv->m_clientAddr),
&iaddrlength,
&(vlserv->AcceptOverlapped[vlserv->m_iSockIndex]), // WSAOVERLAPPED
NULL); // Completion function
if (iRet <= 0)
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
cout << "WSARecvFrom Failed" << WSAGetLastError() << endl;
if (vlserv->EventArray[vlserv->m_iSockIndex] != WSA_INVALID_EVENT)
{
WSACloseEvent(vlserv->EventArray[vlserv->m_iSockIndex]);
}
break;
}
else if (WSAGetLastError() == WSA_IO_PENDING)
{
cout << i << endl;
continue;
}
}
/*
之后省去
*/
...
}
很奇怪.. 并没有申请其他内存 只是在recv等待数据 客户端都没有开启过
怎么会出现10055呢...