/********************************************************************************* 监听者 *********************************************************************************/ DWORD GTcpSvr_CreateListen(char *lpszLocalIp, DWORD dwLocalPort, void* pOwner) { if((!bGTcpSvrIsActive) || (WSA_MAXIMUM_WAIT_EVENTS <= dwGTcpSvrListenerCount)) return(0); SOCKADDR_IN Addr; PGHND_DATA pListener; pListener = GHndDat_Alloc(); if(!pListener) { GLog_Write("GTcpSvr_CreateListen:分配HndData失败,无法创建一个监听者"); return(0); } #if(!_REUSED_SOCKET) GSock_InitTcpHndData(pListener); #endif Addr.sin_family = AF_INET; Addr.sin_addr.S_un.S_addr = inet_addr(lpszLocalIp); Addr.sin_port = htons((u_short)dwLocalPort); if((SOCKET_ERROR == bind(pListener->Socket, (PSOCKADDR)&Addr, sizeof(SOCKADDR_IN))) || (SOCKET_ERROR == listen(pListener->Socket, SOMAXCONN))) { #if(!_REUSED_SOCKET) GSock_UninitTcpHndData(pListener); #endif GHndDat_Free(pListener); GLog_Write("GTcpSvr_CreateListen:绑定或监听操作失败,无法创建一个监听者"); return(0); } pListener->pfnOnIocpOper = >cpSvr_OnAccept; pListener->pfnOnIocpError = >cpSvr_OnAcceptError; pListener->dwAddr = Addr.sin_addr.S_un.S_addr; pListener->dwPort = dwLocalPort; pListener->htType = GHND_TYPE_TCP_SVR_LISTEN; pListener->hsState = GHND_STATE_LISTENING; pListener->pOwner = pOwner; pListener->pData = NULL; if(!GTcpSvr_PostAccept(pListener, dwGSockNumberPostAccept)) { #if(!_REUSED_SOCKET) GSock_UninitTcpHndData(pListener); #endif GHndDat_Free(pListener); GLog_Write("GTcpSvr_CreateListen:投递接受失败“GTcpSvr_PostAccept”,无法创建一个监听者"); return(0); } EnterCriticalSection(>cpSvrListenerCS); pGTcpSvrListeners[dwGTcpSvrListenerCount] = pListener; hGTcpSvrListenerEvents[dwGTcpSvrListenerCount] = CreateEvent(NULL, FALSE, FALSE, NULL); WSAEventSelect(pListener->Socket, hGTcpSvrListenerEvents[dwGTcpSvrListenerCount], FD_ACCEPT); dwGTcpSvrListenerCount++; LeaveCriticalSection(>cpSvrListenerCS); return(DWORD(pListener)); }
DWORD GTcpClt_CreateClient(char *pszRemoteIp, DWORD dwRemotePort, char *pszLocalIp, void* pOwner) { PGHND_DATA pClient; pClient = GHndDat_Alloc(); if(!pClient) { GLog_Write("GTcpClt_CreateClient:申请HndData失败,无法创建连接"); return(0); } #if(!_REUSED_SOCKET) GSock_InitTcpHndData(pClient); #endif SOCKADDR_IN saLocalAddr; saLocalAddr.sin_family = AF_INET; saLocalAddr.sin_addr.S_un.S_addr = inet_addr(pszLocalIp); saLocalAddr.sin_port = htons(0); do { if(SOCKET_ERROR == bind(pClient->Socket, (sockaddr *)&(saLocalAddr), sizeof(SOCKADDR_IN))) { #if(_REUSED_SOCKET) GTcpClt_DisconnectEx(pClient); #else GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); GLog_Write("GTcpClt_CreateClient:bind失败,无法创建连接"); return(0); }else break; }while(1); pClient->htType = GHND_TYPE_TCP_CLT_CLIENT; pClient->pData = NULL; pClient->pOwner = pOwner; pClient->dwAddr = inet_addr(pszRemoteIp); pClient->dwPort = dwRemotePort; GTcpClt_InsertClientList(pClient); pfnOnGSockCreateClientClt(DWORD(pClient)); if(!GTcpClt_Connect(pClient)) { GTcpClt_DeleteClientList(pClient); pfnOnGSockDestroyClientClt(DWORD(pClient)); #if(_REUSED_SOCKET) GTcpClt_DisconnectEx(pClient); #else GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); GLog_Write("GTcpClt_CreateClient:GTcpClt_Connect失败,无法创建连接"); return(0); }else return((DWORD)pClient); }
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 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_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 GTcpClt_FreeClients(void) { PGHND_DATA pClient, tmp; GLog_Write("GTcpClt_FreeClients:正在释放客户端"); pClient = pGTcpCltClientHead; while(pClient) { tmp = pClient->pNext; pfnOnGSockDestroyClientClt(DWORD(pClient)); GTcpClt_DeleteClientList(pClient); GHndDat_Free(pClient); pClient = tmp; } GLog_Write("GTcpClt_FreeClients:成功释放客户端"); }
void GTcpSvr_FreeListener(void) { for(DWORD i = 0; i < dwGTcpSvrListenerCount; i++) GHndDat_Free(pGTcpSvrListeners[i]); }
BOOL GTcpSvr_PostAccept(PGHND_DATA pListener, DWORD dwCount) { int nCount; PGHND_DATA pClient; PGIO_DATA pIoData; nCount = 0; while(dwCount && (dwGTcpSvrClientCount + dwGTcpSvrPendingAcceptCount < dwGSockMaxNumberConnection)) { pClient = GHndDat_Alloc(); if(!pClient) { GLog_Write("GTcpSvr_PostAccept:分配HndData失败,无法投递接受"); return(nCount); } #if(!_REUSED_SOCKET) GSock_InitTcpHndData(pClient); //初始化CLIENT 【初始化SOCKET】 #endif pIoData = GIoDat_Alloc(__FUNCTION__); if(!pIoData) { #if(!_REUSED_SOCKET) GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); GLog_Write("GTcpSvr_PostAccept:分配IoData失败,无法投递接受"); return(nCount); } pClient->pfnOnIocpOper = >cpSvr_OnReadWrite; pClient->pfnOnIocpError = >cpSvr_OnReadWriteError; pClient->htType = GHND_TYPE_TCP_SVR_CLIENT; pClient->hsState = GHND_STATE_ACCEPTING; pClient->pOwner = pListener; pClient->pData = NULL; pIoData->OperType = GIO_CONNECTED; pIoData->pOwner = pClient; pIoData->WSABuf.len = dwGSockRecvBytes; GTcpSvr_InsertPendingAcceptList(pClient); if((!GTcpSvr_AcceptEx(pListener, pClient, pIoData)) && (ERROR_IO_PENDING != WSAGetLastError())) { GTcpSvr_DeletePendingAcceptList(pClient); GIoDat_Free(pIoData,__FUNCTION__); #if(!_REUSED_SOCKET) GSock_UninitTcpHndData(pClient); #endif GHndDat_Free(pClient); GLog_Write("GTcpSvr_PostAccept:执行pfnGTcpSvrAcceptEx失败,无法投递接受"); return(nCount); } else { #if(_OUTWSDATA_INFO) std::stringstream ss; ss << "["<<pIoData << "][WSARecv][GTcpSvr_PostAccept]"; GLog_Write(const_cast<char*>(ss.str().c_str())); #endif } dwCount--; nCount++; }//for(i = 0; i < dwCount; i++) return(TRUE); }