void GTcpClt_OnReadWrite(DWORD dwBytes, PGHND_DATA pClient, PGIO_DATA pIoData) { if(!dwBytes) { if((GIO_READ_COMPLETED == pIoData->OperType) && bGSockIsZeroByteRecv) { GIoDat_ResetIoDataOnRead(pIoData); pIoData->OperType = GIO_ZERO_READ_COMPLETED; pIoData->WSABuf.len = dwGBufSize; dwBytes = 0; DWORD dwFlag = 0; if((SOCKET_ERROR == WSARecv(pClient->Socket, &(pIoData->WSABuf), 1, &dwBytes, &dwFlag, LPWSAOVERLAPPED(pIoData), NULL)) || (ERROR_IO_PENDING == WSAGetLastError())) { return; } } GTcpClt_OnReadWriteError(pClient, pIoData); return; } pClient->dwTickCountAcitve = GetTickCount(); if(GIO_WRITE_COMPLETED == pIoData->OperType) { pfnOnGSockSendedClt((DWORD)pClient, pIoData->cData, dwBytes); GIoDat_Free(pIoData); }else { #if(_USE_GPROTOCOL) if(GCommProt_ProcessReceive(pClient, pIoData->cData, dwBytes, pfnOnGSockReceiveClt)) { pIoData = GIoDat_Alloc(); if(!pIoData) { GLog_Write("GTcpClt_OnReadWrite:IoData分配失败,无法再投递接收"); return; } } #else pfnOnGSockReceiveClt((DWORD)pClient, pIoData->cData, dwBytes); #endif GIoDat_ResetIoDataOnRead(pIoData); pIoData->OperType = GIO_READ_COMPLETED; pIoData->WSABuf.len = dwGSockRecvBytes; dwBytes = 0; DWORD dwFlag = 0; if((SOCKET_ERROR == WSARecv(pClient->Socket, &(pIoData->WSABuf), 1, &dwBytes, &dwFlag, LPWSAOVERLAPPED(pIoData), NULL)) && (ERROR_IO_PENDING != WSAGetLastError())) { GTcpClt_OnReadWriteError(pClient, pIoData); } } }
BOOL GTcpClt_Connect(PGHND_DATA pClient) { PGIO_DATA pIoData; pIoData = GIoDat_Alloc(); if(!pIoData) { GLog_Write("GTcpClt_Connect:申请IoData失败,无法连接"); return(FALSE); } SOCKADDR_IN saRemoteAddr; saRemoteAddr.sin_family = AF_INET; saRemoteAddr.sin_addr.S_un.S_addr = pClient->dwAddr; saRemoteAddr.sin_port = htons((WORD)pClient->dwPort); pClient->dwTickCountAcitve = GetTickCount(); pClient->pfnOnIocpOper = >cpClt_OnConnected; pClient->pfnOnIocpError = >cpClt_OnConnectError; pClient->hsState = GHND_STATE_CONNECTING; pIoData->OperType = GIO_READ_COMPLETED; pIoData->pOwner = pClient; pIoData->WSABuf.len = dwGSockRecvBytes; if((!GTcpClt_ConnectEx(pClient, saRemoteAddr, pIoData)) && (WSA_IO_PENDING != WSAGetLastError())) { pClient->hsState = GHND_STATE_DISCONNECT; GIoDat_Free(pIoData); GLog_Write("GTcpClt_Connect:ConnectEx请求失败"); return(FALSE); } return(TRUE); }
void GTcpClt_OnConnectError(PGHND_DATA pClient, PGIO_DATA pIoData) { GIoDat_Free(pIoData); GTcpClt_DisconnectEx(pClient); pClient->dwTickCountAcitve = GetTickCount(); pClient->hsState = GHND_STATE_DISCONNECT; pfnOnGSockConnectError(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_OnReadWriteError(PGHND_DATA pClient, PGIO_DATA pIoData) { if(GIO_WRITE_COMPLETED == pIoData->OperType) pfnOnGSockSendErrorClt((DWORD)pClient, pIoData->cData, pIoData->WSABuf.len); GIoDat_Free(pIoData); if(GHND_STATE_CONNECTED != GSock_InterlockedSet(pClient->hsState, GHND_STATE_DISCONNECT, GHND_STATE_CONNECTED)) return; GTcpClt_DisconnectEx(pClient); pClient->dwTickCountAcitve = GetTickCount(); pfnOnGSockDisconnectClt((DWORD)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); } }
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); }
void GTcpSvr_OnReadWrite(DWORD dwBytes, PGHND_DATA pClient, PGIO_DATA pIoData) { if(!dwBytes) //接收数据为0 { if(bGSockIsZeroByteRecv && (GHND_STATE_CONNECTED == pClient->hsState) && (GIO_READ_COMPLETED == pIoData->OperType)) { GIoDat_ResetIoDataOnRead(pIoData); pIoData->OperType = GIO_ZERO_READ_COMPLETED; pIoData->WSABuf.len = dwGBufSize; dwBytes = 0; DWORD dwFlag = 0; if((SOCKET_ERROR != WSARecv(pClient->Socket, &(pIoData->WSABuf), 1, &dwBytes, &dwFlag, LPWSAOVERLAPPED(pIoData), NULL)) || (ERROR_IO_PENDING == WSAGetLastError())) { return; } } GTcpSvr_OnReadWriteError(pClient, pIoData); return; } if(GIO_WRITE_COMPLETED == pIoData->OperType) { pfnOnGSockSendedSvr((DWORD)pClient, pIoData->cData, dwBytes); GIoDat_Free(pIoData,__FUNCTION__); }else { pClient->dwTickCountAcitve = GetTickCount(); #if(_USE_GPROTOCOL) if(GCommProt_ProcessReceive(pClient, pIoData->cData, dwBytes, pfnOnGSockReceiveSvr)) { pIoData = GIoDat_Alloc(); if(!pIoData) { GLog_Write("GTcpSvr_OnReadWrite:IoData分配失败,无法再投递接收"); return; } } #else pfnOnGSockReceiveSvr((DWORD)pClient, pIoData->cData, dwBytes); #endif GIoDat_ResetIoDataOnRead(pIoData); pIoData->OperType = GIO_READ_COMPLETED; pIoData->WSABuf.len = dwGSockRecvBytes; dwBytes = 0; DWORD dwFlag = 0; if((SOCKET_ERROR == WSARecv(pClient->Socket, &(pIoData->WSABuf), 1, &dwBytes, &dwFlag, LPWSAOVERLAPPED(pIoData), NULL)) && (ERROR_IO_PENDING != WSAGetLastError())) { GTcpSvr_OnReadWriteError(pClient, pIoData); }else { #if(_OUTWSDATA_INFO) std::stringstream ss; ss << "[" <<pIoData<< "][WSARecv][GTcpSvr_OnReadWrite][Error:"<<WSAGetLastError()<<"]"; GLog_Write(const_cast<char*>(ss.str().c_str())); #endif } } }