//接收UDP包服务线程
unsigned _stdcall CQueryServer::ReceivingServerThrd(PVOID param)
{ TY_Thread_Struct *m_ThreadParam = (TY_Thread_Struct*)param;
IO_OPERATION_DATA m_iIO; //读扩展重叠结构数据结构
IO_OPERATION_DATA m_oIO; //写扩展重叠结构数据结构 struct sockaddr_in SenderAddr; ZeroMemory(&m_iIO, sizeof(IO_OPERATION_DATA)); ZeroMemory(&m_oIO, sizeof(IO_OPERATION_DATA)); m_iIO.type = 0x1; m_oIO.type = 0x2; m_oIO.ThreadID = m_ThreadParam->intIndex; //接收数据工作区
WSABUF DataBuf;
char RecvBuf[BUFFER_SIZE];
int BufLen = BUFFER_SIZE;
DWORD BytesRecv = 0;
DWORD Flags = 0;
int reValue;
int SenderAddrSize = sizeof(SenderAddr); //DNS返回包大小
DWORD intPack; //接收工作区长度
DataBuf.len = BufLen; //接收缓存地址
DataBuf.buf = RecvBuf;
memset(RecvBuf,0,BufLen);
//进入临界区
EnterCriticalSection(m_ThreadParam->m_lpGs);
reValue = WSARecvFrom(m_ThreadParam->m_DnsUDPSocket,
&DataBuf,
1,
&BytesRecv,
&Flags,
(SOCKADDR *)&SenderAddr,
&SenderAddrSize,
&m_iIO.overlapped, NULL);
LeaveCriticalSection(m_ThreadParam->m_lpGs); DWORD nBytesToBeRead;
DWORD nSocket;
LPOVERLAPPED lpOverlapped; //重叠结构指针;
PIO_OPERATION_DATA pIO; BOOL ret; DNS_PTR *lp_dnsptr = CMemoryManager::GetLDnsPtr(); DNS_PTR::iterator it; for (;m_ThreadParam->m_lpUdpServer->lp_MemGr->bolRuning;)
{
ret = GetQueuedCompletionStatus(m_ThreadParam->m_CompleHandle,
&nBytesToBeRead,&nSocket,&lpOverlapped,INFINITE);
//获取扩展重叠结构指针
pIO = CONTAINING_RECORD(lpOverlapped,
IO_OPERATION_DATA,
overlapped); if(ret==0)
{
switch(WSAGetLastError())
{
case WAIT_TIMEOUT:
printf("Time out...\r\n");
break;
case ERROR_SUCCESS:
printf("socket close...\r\n");
break;
case 234:
printf("error 234..\n");
//Sleep(100);
goto lopReceive;
//m_ThreadParam->m_lpUdpServer->m_MemPrint.PrintData();
break;
default:
{
printf("%d nBytesToBeRead=%d Error=%d Stop....\r\n",
m_ThreadParam->intIndex,nBytesToBeRead,WSAGetLastError()); Sleep(2000); continue;
} } }
if(pIO->type == 0x1 && nBytesToBeRead != 0)
{
printf("%d Receive ok size %d\r\n",m_ThreadParam->intIndex,nBytesToBeRead); intPack = nBytesToBeRead; //拆装包
ret = m_ThreadParam->m_lpUdpServer->TakeApartPack((unsigned char*)DataBuf.buf,SenderAddr.sin_addr.S_un.S_addr,intPack);
//printf("\n An=%x\n",);
//客户端的数据包大小
DataBuf.len = intPack; if(intPack > 0)
{
EnterCriticalSection(m_ThreadParam->m_lpGs); printf("send %d-%d\r\n",m_ThreadParam->intIndex,intPack);
//发送返回至客户端
reValue = WSASendTo(m_ThreadParam->m_DnsUDPSocket,&DataBuf,1,&intPack,0,
(SOCKADDR*)&SenderAddr,SenderAddrSize,&m_oIO.overlapped, NULL); LeaveCriticalSection(m_ThreadParam->m_lpGs); if (reValue == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
printf("send err=%d",WSAGetLastError()); continue;
//return FALSE;
}
}
//则要保存至缓存中
if(ret == 3)
{
m_ThreadParam->m_lpUdpServer->lp_MemGr->bolNauSave = FALSE; m_ThreadParam->m_lpUdpServer->m_SaveNaData.SaveHeadRecord(RecvBuf); //非权威数据保存完毕
m_ThreadParam->m_lpUdpServer->lp_MemGr->bolNauSave = TRUE;
}
}
} if(pIO->type == 0x2 )//发送完成
{
printf("Have send %d-%d\r\n",m_ThreadParam->intIndex,nBytesToBeRead);lopReceive: memset(RecvBuf,0,BufLen); EnterCriticalSection(m_ThreadParam->m_lpGs); reValue = WSARecvFrom(m_ThreadParam->m_DnsUDPSocket,
&DataBuf,
1,
&BytesRecv,
&Flags,
(SOCKADDR *) & SenderAddr,
&SenderAddrSize, &m_iIO.overlapped, NULL); LeaveCriticalSection(m_ThreadParam->m_lpGs); if (reValue == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
printf("Recv err=%d",WSAGetLastError());
//return FALSE;
continue;
}
} } }
delete m_ThreadParam; return 0;
}这是我的线程,各位兄弟有没有解决的办法?
unsigned _stdcall CQueryServer::ReceivingServerThrd(PVOID param)
{ TY_Thread_Struct *m_ThreadParam = (TY_Thread_Struct*)param;
IO_OPERATION_DATA m_iIO; //读扩展重叠结构数据结构
IO_OPERATION_DATA m_oIO; //写扩展重叠结构数据结构 struct sockaddr_in SenderAddr; ZeroMemory(&m_iIO, sizeof(IO_OPERATION_DATA)); ZeroMemory(&m_oIO, sizeof(IO_OPERATION_DATA)); m_iIO.type = 0x1; m_oIO.type = 0x2; m_oIO.ThreadID = m_ThreadParam->intIndex; //接收数据工作区
WSABUF DataBuf;
char RecvBuf[BUFFER_SIZE];
int BufLen = BUFFER_SIZE;
DWORD BytesRecv = 0;
DWORD Flags = 0;
int reValue;
int SenderAddrSize = sizeof(SenderAddr); //DNS返回包大小
DWORD intPack; //接收工作区长度
DataBuf.len = BufLen; //接收缓存地址
DataBuf.buf = RecvBuf;
memset(RecvBuf,0,BufLen);
//进入临界区
EnterCriticalSection(m_ThreadParam->m_lpGs);
reValue = WSARecvFrom(m_ThreadParam->m_DnsUDPSocket,
&DataBuf,
1,
&BytesRecv,
&Flags,
(SOCKADDR *)&SenderAddr,
&SenderAddrSize,
&m_iIO.overlapped, NULL);
LeaveCriticalSection(m_ThreadParam->m_lpGs); DWORD nBytesToBeRead;
DWORD nSocket;
LPOVERLAPPED lpOverlapped; //重叠结构指针;
PIO_OPERATION_DATA pIO; BOOL ret; DNS_PTR *lp_dnsptr = CMemoryManager::GetLDnsPtr(); DNS_PTR::iterator it; for (;m_ThreadParam->m_lpUdpServer->lp_MemGr->bolRuning;)
{
ret = GetQueuedCompletionStatus(m_ThreadParam->m_CompleHandle,
&nBytesToBeRead,&nSocket,&lpOverlapped,INFINITE);
//获取扩展重叠结构指针
pIO = CONTAINING_RECORD(lpOverlapped,
IO_OPERATION_DATA,
overlapped); if(ret==0)
{
switch(WSAGetLastError())
{
case WAIT_TIMEOUT:
printf("Time out...\r\n");
break;
case ERROR_SUCCESS:
printf("socket close...\r\n");
break;
case 234:
printf("error 234..\n");
//Sleep(100);
goto lopReceive;
//m_ThreadParam->m_lpUdpServer->m_MemPrint.PrintData();
break;
default:
{
printf("%d nBytesToBeRead=%d Error=%d Stop....\r\n",
m_ThreadParam->intIndex,nBytesToBeRead,WSAGetLastError()); Sleep(2000); continue;
} } }
if(pIO->type == 0x1 && nBytesToBeRead != 0)
{
printf("%d Receive ok size %d\r\n",m_ThreadParam->intIndex,nBytesToBeRead); intPack = nBytesToBeRead; //拆装包
ret = m_ThreadParam->m_lpUdpServer->TakeApartPack((unsigned char*)DataBuf.buf,SenderAddr.sin_addr.S_un.S_addr,intPack);
//printf("\n An=%x\n",);
//客户端的数据包大小
DataBuf.len = intPack; if(intPack > 0)
{
EnterCriticalSection(m_ThreadParam->m_lpGs); printf("send %d-%d\r\n",m_ThreadParam->intIndex,intPack);
//发送返回至客户端
reValue = WSASendTo(m_ThreadParam->m_DnsUDPSocket,&DataBuf,1,&intPack,0,
(SOCKADDR*)&SenderAddr,SenderAddrSize,&m_oIO.overlapped, NULL); LeaveCriticalSection(m_ThreadParam->m_lpGs); if (reValue == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
printf("send err=%d",WSAGetLastError()); continue;
//return FALSE;
}
}
//则要保存至缓存中
if(ret == 3)
{
m_ThreadParam->m_lpUdpServer->lp_MemGr->bolNauSave = FALSE; m_ThreadParam->m_lpUdpServer->m_SaveNaData.SaveHeadRecord(RecvBuf); //非权威数据保存完毕
m_ThreadParam->m_lpUdpServer->lp_MemGr->bolNauSave = TRUE;
}
}
} if(pIO->type == 0x2 )//发送完成
{
printf("Have send %d-%d\r\n",m_ThreadParam->intIndex,nBytesToBeRead);lopReceive: memset(RecvBuf,0,BufLen); EnterCriticalSection(m_ThreadParam->m_lpGs); reValue = WSARecvFrom(m_ThreadParam->m_DnsUDPSocket,
&DataBuf,
1,
&BytesRecv,
&Flags,
(SOCKADDR *) & SenderAddr,
&SenderAddrSize, &m_iIO.overlapped, NULL); LeaveCriticalSection(m_ThreadParam->m_lpGs); if (reValue == SOCKET_ERROR)
{
if(ERROR_IO_PENDING != WSAGetLastError())
{
printf("Recv err=%d",WSAGetLastError());
//return FALSE;
continue;
}
} } }
delete m_ThreadParam; return 0;
}这是我的线程,各位兄弟有没有解决的办法?
An existing connection was forcibly closed by the remote host. This normally results if the peer application on the remote host is suddenly stopped, the host is rebooted, the host or remote network interface is disabled, or the remote host uses a hard close (see setsockopt for more information on the SO_LINGER option on the remote socket). This error may also result if a connection was broken due to keep-alive activity detecting a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET.
可以找到答案:)