Beispiel #1
0
/*********************************************************************************
                   监听者
*********************************************************************************/
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 = &GTcpSvr_OnAccept;
	pListener->pfnOnIocpError = &GTcpSvr_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(&GTcpSvrListenerCS);
	pGTcpSvrListeners[dwGTcpSvrListenerCount] = pListener;
	hGTcpSvrListenerEvents[dwGTcpSvrListenerCount] = CreateEvent(NULL, FALSE, FALSE, NULL);
	WSAEventSelect(pListener->Socket, hGTcpSvrListenerEvents[dwGTcpSvrListenerCount], FD_ACCEPT);
	dwGTcpSvrListenerCount++;
	LeaveCriticalSection(&GTcpSvrListenerCS);

	return(DWORD(pListener));
}
Beispiel #2
0
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);
}
Beispiel #3
0
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);
}