Example #1
0
BOOL 
CLpxDatagramSocket::RecvFrom(DWORD cbBufferMax, DWORD dwRecvFlags)
{
	LockRecvQueue();

	_ASSERTE(cbBufferMax > 0);

	BOOL fSuccess = FALSE;

	fSuccess = AllocRecvBuf(cbBufferMax);
	if (!fSuccess) {
		UnlockRecvQueue();
		return FALSE;
	}

	fSuccess = ::ResetEvent(m_hReceivedEvent);
	_ASSERTE(fSuccess);

	m_ovReceive.hEvent = m_hReceivedEvent;
	m_ovReceive.Internal = 
	m_ovReceive.InternalHigh = 
	m_ovReceive.Offset = 
	m_ovReceive.OffsetHigh = 0;

	DWORD cbReceived = 0;
	m_receiveFlags = dwRecvFlags;
	m_iRemoteAddrLen = sizeof(m_remoteAddr);

	INT iResult = ::WSARecvFrom(
		m_sock,
		&m_wsaReceiveBuffer, 1,
		&cbReceived,
		&m_receiveFlags,
		(struct sockaddr*) &m_remoteAddr,
		&m_iRemoteAddrLen,
		&m_ovReceive,
		NULL);

	if (0 == iResult) {
		fSuccess = ::SetEvent(m_hReceivedEvent);
		_ASSERTE(fSuccess);
		return TRUE;
	}

	if (WSA_IO_PENDING == ::WSAGetLastError()) {
		return TRUE;
	}

	UnlockRecvQueue();
	return FALSE;
}
Example #2
0
BOOL 
CLpxStreamConnection::Recv(DWORD cbBufferMax, LPDWORD lpdwFlags)
{
	_ASSERTE(INVALID_SOCKET != m_sock);

	BOOL fSuccess = FALSE;
	DWORD cbReceived = 0;

	fSuccess = AllocRecvBuf(cbBufferMax);
	if (!fSuccess) {
		DBGPRT_ERR_EX(_FT("AllocRecvBuf failed: "));
		return FALSE;
	}

	ResetRecvOverlapped();

	INT iResult = ::WSARecv(
		m_sock,
		&m_wsaReceiveBuffer, 1,
		&cbReceived, lpdwFlags,
		&m_ovReceive, NULL);

	if (0 != iResult && WSA_IO_PENDING != ::WSAGetLastError()) {
		DBGPRT_ERR_EX(_FT("Recv at sock %p up to %d bytes failed: "),
			m_sock, cbBufferMax);
		return FALSE;
	}

	if (0 == iResult) {
		fSuccess = ::SetEvent(m_hReceivedEvent);
		_ASSERTE(fSuccess);
		return TRUE;
	}

	return TRUE;
}
Example #3
0
BOOL 
CLpxStreamConnection::Recv(DWORD cbBufferMax, LPDWORD lpdwFlags)
{
	_ASSERTE(INVALID_SOCKET != m_sock);

	BOOL fSuccess = FALSE;
	DWORD cbReceived = 0;

	fSuccess = AllocRecvBuf(cbBufferMax);
	if (!fSuccess) {
		XTLTRACE("AllocRecvBuf failed, error=0x%X\n", GetLastError());
		return FALSE;
	}

	ResetRecvOverlapped();

	INT iResult = ::WSARecv(
		m_sock,
		&m_wsaReceiveBuffer, 1,
		&cbReceived, lpdwFlags,
		&m_ovReceive, NULL);

	if (0 != iResult && WSA_IO_PENDING != ::WSAGetLastError()) {
		XTLTRACE("CLpxStreamConnection.Recv failed, max bytes=%d, socket=%p, error=0x%X\n", 
			cbBufferMax, reinterpret_cast<PVOID>(m_sock), WSAGetLastError());
		return FALSE;
	}

	if (0 == iResult) {
		fSuccess = ::SetEvent(m_hReceivedEvent);
		_ASSERTE(fSuccess);
		return TRUE;
	}

	return TRUE;
}
Example #4
0
BOOL 
CLpxStreamListener::Accept(SOCKET sockAccept, DWORD cbDataBuffer)
{
	_ASSERTE(INVALID_SOCKET != m_sock);
	_ASSERTE(INVALID_SOCKET != sockAccept);

	BOOL fSuccess = FALSE;

	DWORD cbBufReq = (sizeof(SOCKADDR_LPX) + 16) * 2 + cbDataBuffer;
	fSuccess = AllocRecvBuf(cbBufReq);
	if (!fSuccess) {
		DBGPRT_ERR_EX(_FT("AllocRecvBuf failed: "));
		return FALSE;
	}

	DWORD cbAcceptBuffer = m_wsaReceiveBuffer.len;
	PVOID pbAcceptBuffer = m_wsaReceiveBuffer.buf;

	ResetRecvOverlapped();

	//----------------------------------------
	// Load the AcceptEx function into memory using WSAIoctl.
	// The WSAIoctl function is an extension of the ioctlsocket()
	// function that can use overlapped I/O. The function's 3rd
	// through 6th parameters are input and output buffers where
	// we pass the pointer to our AcceptEx function. This is used
	// so that we can call the AcceptEx function directly, rather
	// than refer to the Mswsock.lib library.
	LPFN_ACCEPTEX lpfnAcceptEx = NULL;
	GUID GuidAcceptEx = WSAID_ACCEPTEX;
	DWORD cbRead;
	INT iResult = ::WSAIoctl(m_sock, 
		SIO_GET_EXTENSION_FUNCTION_POINTER, 
		&GuidAcceptEx, 
		sizeof(GuidAcceptEx),
		&lpfnAcceptEx, 
		sizeof(lpfnAcceptEx), 
		&cbRead,
		NULL, 
		NULL);

	if (NULL == lpfnAcceptEx) {
		DBGPRT_ERR_EX(_FT("Cannot load AcceptEx function: "));
		return FALSE;
	}

	DWORD cbReceived = 0;
	fSuccess = lpfnAcceptEx(
		m_sock, 
		sockAccept, 
		pbAcceptBuffer, 
		cbDataBuffer,
		sizeof(SOCKADDR_LPX) + 16,
		sizeof(SOCKADDR_LPX) + 16,
		&cbReceived,
		&m_ovReceive);

	if (!fSuccess && ERROR_IO_PENDING != ::GetLastError()) {
		return FALSE;
	}

	iResult = ::setsockopt(
		sockAccept, 
		SOL_SOCKET, 
		SO_UPDATE_ACCEPT_CONTEXT, 
		(char *)&m_sock, 
		sizeof(m_sock));

	if (0 != iResult) {
		DBGPRT_WARN_EX(_FT("Setting SO_UPDATE_ACCEPT_CONTEXT failed: "));
	}

	if (fSuccess) {
		::SetEvent(m_hReceivedEvent);
		return TRUE;
	}

	return TRUE;
}