コード例 #1
0
ファイル: Client.cpp プロジェクト: linse073/BaseLib
bool CClient::Start()
{
	do 
	{
		if (m_socket == INVALID_SOCKET)
		{
			m_socket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
			if (m_socket == INVALID_SOCKET)
			{
				LOGNET("Fail to create client[%d] socket.", GetID());
				break;
			}
		}

		static GUID GuidAcceptEx = WSAID_ACCEPTEX;
		static LPFN_ACCEPTEX AcceptEx = (LPFN_ACCEPTEX)GetExtensionFunction(m_pServer->GetListenSocket(), GuidAcceptEx);
		NetData* pData = m_accept.GetNetData();
		pData->extra = this;
		DWORD recvLen = 0;
		if (AcceptEx(m_pServer->GetListenSocket(), m_socket, pData->buffer.buf, 0, 
			sizeof(SOCKADDR_IN)+16, sizeof(SOCKADDR_IN)+16, &recvLen, &pData->overlapped) == FALSE)
		{
			if (WSAGetLastError() != WSA_IO_PENDING)
			{
				LOGNET("Client[%d] fail to call AcceptEx.", GetID());
				break;
			}
		}

		return true;
	} while (false);

	Stop();
	return false;
}
コード例 #2
0
VOID * SocketExtension::GetExtensionFunction(GUID * clasid)
{
	if (clasid == NULL)
	{
		return NULL;
	}
	INT error = 0;
	SOCKET s = LayeredServiceProvider_Current.NextProcTable.lpWSPSocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED, &error);
	if (s == INVALID_SOCKET)
	{
		return NULL;
	}
	VOID* func = GetExtensionFunction(s, clasid);
	LayeredServiceProvider_Current.NextProcTable.lpWSPShutdown(s, SD_BOTH, &error);
	LayeredServiceProvider_Current.NextProcTable.lpWSPCloseSocket(s, &error);
	return func;
}
コード例 #3
0
ファイル: Client.cpp プロジェクト: linse073/BaseLib
bool CClient::AppendDisconnect(bool restart)
{
	static GUID GuidDisconnectEx = WSAID_DISCONNECTEX;
	static LPFN_DISCONNECTEX DisconnectEx = (LPFN_DISCONNECTEX)GetExtensionFunction(m_socket, GuidDisconnectEx);
	CLock lock(&m_criticalSection);
	NetData* pData = m_discon.GetNetData();
	if (DisconnectEx(m_socket, &pData->overlapped, TF_REUSE_SOCKET, 0) == FALSE)
	{
		if (WSAGetLastError() != WSA_IO_PENDING)
		{
			LOGNET("Client[%d] to call DisconnectEx.", GetID());
			return false;
		}
	}
	m_status = NETSTATUS_Disconnecting;
	m_lastActionTime = (int)time(NULL);
	return true;
}
コード例 #4
0
VOID * SocketExtension::GetExtensionFunction(GUID clasid)
{
	return GetExtensionFunction(&clasid);
}
コード例 #5
0
VOID * SocketExtension::GetExtensionFunction(SOCKET s, GUID clasid)
{
	return GetExtensionFunction(s, &clasid);
}