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); } } }
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:连接超过最大值"); } }
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 } } }