Пример #1
0
void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj)
{
	VERIFY(::PostIocpAccept(m_hCompletePort));

	int iLocalSockaddrLen;
	int iRemoteSockaddrLen;
	HP_PSOCKADDR pLocalSockAddr;
	HP_PSOCKADDR pRemoteSockAddr;

	int iAddrLen = HP_SOCKADDR::AddrSize(m_usFamily) + 16;

	m_pfnGetAcceptExSockaddrs
							(
								pBufferObj->buff.buf,
								0,
								iAddrLen,
								iAddrLen,
								(SOCKADDR**)&pLocalSockAddr,
								&iLocalSockaddrLen,
								(SOCKADDR**)&pRemoteSockAddr,
								&iRemoteSockaddrLen
							);

	CONNID dwConnID = 0;
	SOCKET socket	= pBufferObj->client;

	if(!HasStarted() || !m_bfActiveSockets.AcquireLock(dwConnID))
	{
		::ManualCloseSocket(socket, SD_BOTH);
		AddFreeBufferObj(pBufferObj);

		return;
	}

	TSocketObj* pSocketObj = GetFreeSocketObj(dwConnID, socket);

	pRemoteSockAddr->Copy(pSocketObj->remoteAddr);
	AddClientSocketObj(dwConnID, pSocketObj);

	::SSO_UpdateAcceptContext(socket, soListen);
	::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0);

	if(TriggerFireAccept(pSocketObj) != HR_ERROR)
		DoReceive(pSocketObj, pBufferObj);
	else
	{
		AddFreeSocketObj(pSocketObj, SCF_NONE);
		AddFreeBufferObj(pBufferObj);
	}
}
Пример #2
0
void CIocpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj)
{
	DeleteAcceptSocket(pBufferObj->client);

	int iLocalSockaddrLen;
	int iRemoteSockaddrLen;
	SOCKADDR* pLocalSockAddr;
	SOCKADDR* pRemoteSockAddr;

	//将AcceptEx接受的第一块数据中的本地和远程机器的地址返回给用户
	m_pfnGetAcceptExSockaddrs
		(
		pBufferObj->buff.buf,
		0,
		sizeof(SOCKADDR_IN) + 16,
		sizeof(SOCKADDR_IN) + 16,
		(SOCKADDR **)&pLocalSockAddr,
		&iLocalSockaddrLen,
		(SOCKADDR **)&pRemoteSockAddr,
		&iRemoteSockaddrLen
		);

	TSocketObj* pSocketObj	= GetFreeSocketObj();
	pSocketObj->socket		= pBufferObj->client;
	pSocketObj->connID		= ::InterlockedIncrement((LONG*)&m_dwConnID);
	//InterlockedIncrement 对m_dwConnID加1 在对m_dwConnID访问的时候其他线程不能访问这个变量
	memcpy(&pSocketObj->clientAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN));  //远程机器的地址
	AddClientSocketObj(pSocketObj->connID, pSocketObj);

	int result = 0;

	result = ::SSO_UpdateAcceptContext(pSocketObj->socket, soListen);
	ASSERT(result == 0);

	if(m_dwKeepAliveTimes > 0 && m_dwKeepAliveInterval > 0)
	{
		result = ::SSO_KeepAliveVals(pSocketObj->socket, TRUE, m_dwKeepAliveTimes, m_dwKeepAliveInterval);
		ASSERT(result == 0);
	}

	//result = ::SSO_NoDelay(pSocketObj->socket, TRUE);
	//ASSERT(result == 0);

	VERIFY(::CreateIoCompletionPort((HANDLE)pSocketObj->socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0));

	FireAccept(pSocketObj->connID);  //打印连接
	//接受连接成功后 投递一个接收
	DoReceive(pSocketObj, pBufferObj);
}
Пример #3
0
void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj)
{
	::PostQueuedCompletionStatus(m_hCompletePort, IOCP_SI_ACCEPT, 0, nullptr);

	int iLocalSockaddrLen;
	int iRemoteSockaddrLen;
	SOCKADDR* pLocalSockAddr;
	SOCKADDR* pRemoteSockAddr;

	m_pfnGetAcceptExSockaddrs
							(
								pBufferObj->buff.buf,
								0,
								sizeof(SOCKADDR_IN) + 16,
								sizeof(SOCKADDR_IN) + 16,
								(SOCKADDR **)&pLocalSockAddr,
								&iLocalSockaddrLen,
								(SOCKADDR **)&pRemoteSockAddr,
								&iRemoteSockaddrLen
							);

	SOCKET socket			= pBufferObj->client;
	CONNID dwConnID			= ::GenerateConnectionID(m_dwConnID);
	TSocketObj* pSocketObj	= GetFreeSocketObj(dwConnID, socket);

	memcpy(&pSocketObj->clientAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN));
	AddClientSocketObj(dwConnID, pSocketObj);

	VERIFY(::SSO_UpdateAcceptContext(socket, soListen) == NO_ERROR);

	BOOL bOnOff	= (m_dwKeepAliveTime > 0 && m_dwKeepAliveInterval > 0);
	VERIFY(::SSO_KeepAliveVals(socket, bOnOff, m_dwKeepAliveTime, m_dwKeepAliveInterval) == NO_ERROR);

	if(FireAccept(dwConnID, socket) != ISocketListener::HR_ERROR)
	{
		VERIFY(::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0));
		DoReceive(dwConnID, pSocketObj, pBufferObj);
	}
	else
	{
		AddFreeSocketObj(dwConnID, SCF_NONE);
		AddFreeBufferObj(pBufferObj);
	}
}
Пример #4
0
void CTcpServer::HandleAccept(SOCKET soListen, TBufferObj* pBufferObj)
{
	VERIFY(::PostIocpAccept(m_hCompletePort));

	int iLocalSockaddrLen;
	int iRemoteSockaddrLen;
	SOCKADDR* pLocalSockAddr;
	SOCKADDR* pRemoteSockAddr;

	m_pfnGetAcceptExSockaddrs
							(
								pBufferObj->buff.buf,
								0,
								sizeof(SOCKADDR_IN) + 16,
								sizeof(SOCKADDR_IN) + 16,
								(SOCKADDR **)&pLocalSockAddr,
								&iLocalSockaddrLen,
								(SOCKADDR **)&pRemoteSockAddr,
								&iRemoteSockaddrLen
							);

	SOCKET socket			= pBufferObj->client;
	CONNID dwConnID			= ::GenerateConnectionID();
	TSocketObj* pSocketObj	= GetFreeSocketObj(dwConnID, socket);

	memcpy(&pSocketObj->remoteAddr, pRemoteSockAddr, sizeof(SOCKADDR_IN));
	AddClientSocketObj(dwConnID, pSocketObj);

	::SSO_UpdateAcceptContext(socket, soListen);

	if(TriggerFireAccept(pSocketObj) != HR_ERROR)
	{
		::CreateIoCompletionPort((HANDLE)socket, m_hCompletePort, (ULONG_PTR)pSocketObj, 0);
		DoReceive(dwConnID, pSocketObj, pBufferObj);
	}
	else
	{
		AddFreeSocketObj(pSocketObj, SCF_NONE);
		AddFreeBufferObj(pBufferObj);
	}
}