void GTcpClt_DestroyClient(DWORD dwClientContext) { GTcpClt_DeleteClientList((PGHND_DATA)dwClientContext); #if(_REUSED_SOCKET) GTcpClt_DisconnectEx(PGHND_DATA(dwClientContext)); #else GSock_UninitTcpHndData((PGHND_DATA)dwClientContext); #endif GHndDat_Free((PGHND_DATA)dwClientContext); }
void GTcpSvr_OnReadWriteError(PGHND_DATA pClient, PGIO_DATA pIoData) { if(GIO_WRITE_COMPLETED == pIoData->OperType) pfnOnGSockSendErrorSvr((DWORD)pClient, pIoData->cData, pIoData->WSABuf.len); GIoDat_Free(pIoData,__FUNCTION__); if(GHND_STATE_CONNECTED != GSock_InterlockedSet(pClient->hsState, GHND_STATE_DISCONNECT, GHND_STATE_CONNECTED)) return; GTcpSvr_DeleteClientList(pClient); GSock_InterlockedDec(PGHND_DATA(pClient->pOwner)->pData); pfnOnGSockDisconnectSvr((DWORD)pClient); if(GIO_CONNECTION_OVERFLOW == pIoData->OperType) { pfnOnGSockConnectionOverflow((DWORD)pClient); GSock_UninitTcpHndData(pClient); #if(_REUSED_SOCKET) GSock_InitTcpHndData(pClient); #endif GHndDat_Free(pClient); }else if(GIO_IDLE_OVERTIME == pIoData->OperType) { pfnOnGSockIdleOvertime((DWORD)pClient); GSock_UninitTcpHndData(pClient); #if(_REUSED_SOCKET) GSock_InitTcpHndData(pClient); #endif GHndDat_Free(pClient); }else if(GIO_CLOSE == pIoData->OperType) { GSock_UninitTcpHndData(pClient); #if(_REUSED_SOCKET) GSock_InitTcpHndData(pClient); #endif GHndDat_Free(pClient); }else { pfnOnGSockUnknownError((DWORD)pClient); #if(_REUSED_SOCKET) GTcpSvr_DisconnectEx(pClient); #else GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); } }
void GTcpSvr_OnAcceptError(PGHND_DATA pListener, PGIO_DATA pIoData) { PGHND_DATA pClient = PGHND_DATA(pIoData->pOwner); GIoDat_Free(pIoData,__FUNCTION__); if(GHND_STATE_ACCEPTING != GSock_InterlockedSet(pClient->hsState, GHND_STATE_DISCONNECT, GHND_STATE_ACCEPTING)) return; GTcpSvr_DeletePendingAcceptList(pClient); if(GIO_CLOSE == pIoData->OperType) { GSock_UninitTcpHndData(pClient); GHndDat_Free(pClient); }else { #if(_REUSED_SOCKET) GTcpSvr_DisconnectEx(pClient); #else GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); } }
void GTcpSvrServiceThread(PGTHREAD pThread) { DWORD dwResult; PGHND_DATA pClient; INT nResult; INT nLong; INT nLongBytes = sizeof(INT); DWORD dwTickCount; GLog_Write("GTcpSvrServiceThread:伺服线程开始"); for(;;) { #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_SLEEP; #endif if(!dwGTcpSvrListenerCount) { Sleep(1000); dwResult = WSA_WAIT_TIMEOUT; }else dwResult = WSAWaitForMultipleEvents(dwGTcpSvrListenerCount, hGTcpSvrListenerEvents, FALSE, 1000, FALSE); if(pThread->bIsShutdown) break; #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_WORKING1; pThread->dwRunCount++; #endif if(WSA_WAIT_TIMEOUT != dwResult) { dwResult -= WSA_WAIT_EVENT_0; WSAResetEvent(hGTcpSvrListenerEvents[dwResult]); if((dwGTcpSvrClientCount + dwGTcpSvrPendingAcceptCount >= dwGSockMaxNumberConnection) || (!GTcpSvr_PostAccept(pGTcpSvrListeners[dwResult], dwGSockNumberPostAccept))) { SOCKADDR_IN Addr; int nLen; nLen = sizeof(SOCKADDR_IN); closesocket(WSAAccept(pGTcpSvrListeners[dwResult]->Socket, (SOCKADDR*)&Addr, &nLen, NULL, 0)); if(dwGTcpSvrClientCount >= dwGSockMaxNumberConnection) GLog_Write("GTcpSvrServiceThread:超出连接限制"); else GLog_Write("GTcpSvrServiceThread:投递接受“GTcpSvr_PostAccept”失败"); #if(_OUTIODATA_INFO) std::stringstream ss; ss << "[GTcpSvrServiceThread]" << "[SvrClientCount:"<<dwGTcpSvrClientCount <<"|SvrPendingAcceptCount:" <<dwGTcpSvrPendingAcceptCount<< "]"; GLog_Write(const_cast<char*>(ss.str().c_str())); #endif } continue; } if(dwGSockAcceptBytes) { #if(_USE_INTERLOCKED_IN_LIST) GTcpSvr_LockPendingAcceptList(); #else EnterCriticalSection(>cpSvrPendingAcceptCS); #endif #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_WORKING2; #endif pClient = pGTcpSvrPendingAcceptHead; pGTcpSvrOvertimeCount = 0; while(pClient) { nResult = getsockopt(pClient->Socket, SOL_SOCKET, SO_CONNECT_TIME, (char *)&nLong, (PINT)&nLongBytes); if((SOCKET_ERROR != nResult) && (0xFFFFFFFF != nLong) && (dwGSockTimeAcceptOvertime < (DWORD)nLong)) { pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount] = pClient; pGTcpSvrOvertimeCount++; } pClient = pClient->pNext; } #if(_USE_INTERLOCKED_IN_LIST) GTcpSvr_UnlockPendingAcceptList(); #else LeaveCriticalSection(>cpSvrPendingAcceptCS); #endif #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_WORKING3; #endif while(pGTcpSvrOvertimeCount) //overtime send GIO_CLOSE { pGTcpSvrOvertimeCount--; pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount]->dwTickCountAcitve = dwTickCount; GTcpSvr_DoCloseClient(PGHND_DATA(pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount]->pOwner), pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount], GIO_CLOSE); } }//if(dwGSockAcceptBytes) if(dwGSockTimeIdleOvertime) { #if(_USE_INTERLOCKED_IN_LIST) GTcpSvr_LockClientList(); #else EnterCriticalSection(>cpSvrClientCS); #endif #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_WORKING4; #endif pClient = pGTcpSvrClientHead; pGTcpSvrOvertimeCount = 0; dwTickCount = GetTickCount(); while(pClient) {//QueryPerformanceCounter if(dwTickCount >= pClient->dwTickCountAcitve) nLong = dwTickCount - pClient->dwTickCountAcitve; else nLong = 0xFFFFFFFF - pClient->dwTickCountAcitve + dwTickCount; if((DWORD)nLong > dwGSockTimeIdleOvertime) { pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount] = pClient; pGTcpSvrOvertimeCount++; } pClient = pClient->pNext; } #if(_USE_INTERLOCKED_IN_LIST) GTcpSvr_UnlockClientList(); #else LeaveCriticalSection(>cpSvrClientCS); #endif #if(_RUN_INFO) pThread->dwState = GTHREAD_STATE_WORKING5; #endif while(pGTcpSvrOvertimeCount) { pGTcpSvrOvertimeCount--; pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount]->dwTickCountAcitve = dwTickCount; GTcpSvr_DoCloseClient(pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount], pGTcpSvrOvertimeClient[pGTcpSvrOvertimeCount], GIO_IDLE_OVERTIME); } }//if(dwGSockTimeIdleOvertime) }//for(;;) }
void GTcpSvr_OnAccept(DWORD dwBytes, PGHND_DATA pListener, PGIO_DATA pIoData) { if((!dwBytes) && (dwGSockAcceptBytes)) { GTcpSvr_OnAcceptError(pListener, pIoData); return; } PGHND_DATA pClient; PSOCKADDR_IN pAddr; int nLen; pClient = PGHND_DATA(pIoData->pOwner); GTcpSvr_DeletePendingAcceptList(pClient); setsockopt(pClient->Socket, SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, (char *)&(pListener->Socket), sizeof(pListener->Socket)); BOOL bDontLinger = FALSE; setsockopt(pClient->Socket, SOL_SOCKET, SO_DONTLINGER, (const char *) &bDontLinger, sizeof(BOOL)); GTcpSvr_GetAcceptExSockAddrs(pListener, pIoData->cData, dwGSockAcceptBytes, pAddr, nLen); //读取 AcceptEx Buffer pClient->dwAddr = pAddr->sin_addr.S_un.S_addr; pClient->dwPort = htons(pAddr->sin_port); pClient->hsState = GHND_STATE_CONNECTED; pClient->dwTickCountAcitve = GetTickCount(); GTcpSvr_InsertClientList(pClient); pfnOnGSockCreateClientSvr(DWORD(pClient)); //add wangzh creatclient GSock_InterlockedAdd(PGHND_DATA(pClient->pOwner)->pData); #if(_USE_GPROTOCOL) if(GCommProt_ProcessReceive(pClient, pIoData->cData, dwBytes, pfnOnGSockConnectTcpSvr)) { pIoData = GIoDat_Alloc(); if(!pIoData) { GLog_Write("GTcpSvr_OnAccept:IoData分配失败,连接后无法再投递接收"); return; } } #else pfnOnGSockConnectTcpSvr((DWORD)pClient, pIoData->cData, dwBytes); #endif ZeroMemory(pIoData, sizeof(WSAOVERLAPPED)); //清空 POSTACCEPT 发送过来的数据IODATA DWORD dwCount = dwGSockNumberPostRecv; for(;;) { GIoDat_ResetIoDataOnRead(pIoData); //复用数据 pIoData->OperType = GIO_READ_COMPLETED; pIoData->WSABuf.len = dwGSockRecvBytes; dwBytes = 0; DWORD dwFlag = 0; //IODATA用于CLIENT WSARecv的数据 if((SOCKET_ERROR == WSARecv(pClient->Socket, &(pIoData->WSABuf), 1, &dwBytes, &dwFlag, LPWSAOVERLAPPED(pIoData), NULL)) && (ERROR_IO_PENDING != WSAGetLastError())) { GTcpSvr_OnReadWriteError(pClient, pIoData); break; }else { #if(_OUTWSDATA_INFO) std::stringstream ss; ss << "["<<pIoData << "][WSARecv][GTcpSvr_OnAccept][Error:"<<WSAGetLastError()<<"]"; GLog_Write(const_cast<char*>(ss.str().c_str())); #endif } dwCount--; if(!dwCount) break; pIoData = GIoDat_Alloc(__FUNCTION__); if(!pIoData) { GLog_Write("GTcpSvr_OnAccept:申请IoData失败,连接后无法投递接收"); break; } pIoData->pOwner = pClient; //再次创建IODATA CLIENT WSARecv的数据 } if(dwGTcpSvrClientCount >= dwGSockMaxNumberConnection) { pfnOnGSockConnectionOverflow((DWORD)pClient); void GTcpSvr_DoCloseClient(PGHND_DATA pClient, PGHND_DATA pIoDataOwner, GIO_OPER_TYPE OperType); GTcpSvr_DoCloseClient(pClient, pClient, GIO_CLOSE); GLog_Write("GTcpSvr_OnAccept:连接超过最大值"); } }
/********************************************************************************* Listener参数获取 *********************************************************************************/ DWORD GTcpSvr_GetListenerConnectCount(DWORD dwListenerId) { return((DWORD)PGHND_DATA(dwListenerId)->pData); }