//接收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;
}这是我的线程,各位兄弟有没有解决的办法?

解决方案 »

  1.   

    Connection reset by peer. 
    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. 
      

  2.   

    google:error 10054
    可以找到答案:)
      

  3.   

    GOOGLE了不完美,需要有经验的哥们问答1
      

  4.   

    UDP干嘛还用IOCP?是不是出错后GQCS一直报错?