コード例 #1
1
ファイル: GTcpClient.cpp プロジェクト: lubing521/Hitown
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);
		}
	}
}
コード例 #2
0
ファイル: GTcpClient.cpp プロジェクト: lubing521/Hitown
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 = &GTcpClt_OnConnected;
	pClient->pfnOnIocpError = &GTcpClt_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);
}
コード例 #3
0
ファイル: GTcpClient.cpp プロジェクト: lubing521/Hitown
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));
}
コード例 #4
0
ファイル: GTcpServer.cpp プロジェクト: minicool/IOCP
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);
	}
	
}
コード例 #5
0
ファイル: GTcpClient.cpp プロジェクト: lubing521/Hitown
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);
}
コード例 #6
0
ファイル: GTcpServer.cpp プロジェクト: minicool/IOCP
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);
	}
}
コード例 #7
0
ファイル: GTcpServer.cpp プロジェクト: minicool/IOCP
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 = &GTcpSvr_OnReadWrite;
		pClient->pfnOnIocpError = &GTcpSvr_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);
}
コード例 #8
0
ファイル: GTcpServer.cpp プロジェクト: minicool/IOCP
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
		}
	}
}