HRESULT Read(SOCKET socket, MemoryBuffer& buffer) { const size_t position = buffer.GetPosition(); const size_t size = buffer.GetSize(); int length = static_cast<int>(size - position); char* data = reinterpret_cast<char*>(buffer.GetData()) + position; const int status = recv(socket, data, length, 0); if (status <= 0) { const DWORD code = WSAGetLastError(); const HRESULT result = (WSAEWOULDBLOCK == code) ? S_FALSE : E_FAIL; return result; } length -= status; buffer.SetPosition(position + status); if (length > 0) { return S_FALSE; } return S_OK; }
HRESULT CLrpStClientImpl::Invoke(MemoryBuffer& buffer) { uint32 size = static_cast<uint32>(buffer.GetSize()); if (size < sizeof(uint32)) { throw runtime_error("Input buffer is too small"); } buffer.SetPosition(0); WriteInt32(size - 4, buffer); buffer.SetPosition(12); uint16 componentId = ReadUInt16(buffer); uint16 methodId = ReadUInt16(buffer); Translate(componentId, methodId); buffer.SetPosition(12); WriteUInt16(componentId, buffer); WriteUInt16(methodId, buffer); CTimeout timeout(m_operationTimeoutInMs); if (!SendEx(m_socket, timeout, buffer.GetData(), buffer.GetSize())) { closesocket(m_socket); m_socket = INVALID_SOCKET; throw runtime_error("Couldn't send data"); } if (!ReceiveEx(m_socket, timeout, buffer)) { closesocket(m_socket); m_socket = INVALID_SOCKET; throw runtime_error("Couldn't receive data"); } buffer.SetPosition(12); const HRESULT result = ReadInt32(buffer); return result; }
HRESULT Write(SOCKET socket, MemoryBuffer& buffer) { const size_t position = buffer.GetPosition(); const size_t size = buffer.GetSize(); int length = static_cast<int>(size - position); const char* data = reinterpret_cast<const char*>(buffer.GetData()) + position; const int status = send(socket, data, length, 0); if (status < 0) { return E_FAIL; } length -= status; buffer.SetPosition(position + status); if (length > 0) { return S_FALSE; } return S_OK; }