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; }
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; }
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; }
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; }