Example #1
0
        public Task WriteAsync(char messageTypePrefix, string message)
        {
            Contract.Requires(IsConnected);

            int writeBufferStart = 4;
            int totalSize        = writeBufferStart + (1 + message.Length) * s_messageEncodingBytesPerChar;

            if (m_writeBuffer.Length < totalSize)
            {
                m_writeBuffer = new byte[totalSize];
            }

            unsafe
            {
                fixed(byte *pBuf = &m_writeBuffer[0])
                {
                    *(int *)pBuf = totalSize - writeBufferStart;
                }
            }

            writeBufferStart += s_messageEncoding.GetBytes(new[] { messageTypePrefix }, 0, 1, m_writeBuffer, writeBufferStart);
            writeBufferStart += s_messageEncoding.GetBytes(message, 0, message.Length, m_writeBuffer, writeBufferStart);

            return(m_networkStream.WriteAsync(m_writeBuffer, 0, totalSize, m_cancellationToken));
        }
Example #2
0
        internal async Task <string> ReceiveStringAsync()
        {
            Contract.Requires(IsConnected);

            int offset      = 0;
            int payloadSize = -1;

            // Get the first 4 bytes containing the payload size.
            while (payloadSize < 0)
            {
                int bytesRead = await m_networkStream.ReadAsync(m_readBuffer, offset, 4 - offset, m_cancellationToken);

                if (bytesRead == 0)
                {
                    // Socket closed. Unexpected if we have not received data yet.
                    if (offset > 0)
                    {
                        throw new BuildXLException($"{nameof(RemotingClient)}: Unexpected close during message receive");
                    }
                }

                offset += bytesRead;
                if (offset == 4)
                {
                    payloadSize = BitConverter.ToInt32(m_readBuffer, 0);
                }
            }

            if (payloadSize > m_readBuffer.Length)
            {
                m_readBuffer = new byte[payloadSize];
            }

            offset = 0;
            while (offset < payloadSize)
            {
                int bytesRead = await m_networkStream.ReadAsync(m_readBuffer, offset, payloadSize - offset, m_cancellationToken);

                if (bytesRead == 0)
                {
                    // Socket closed.
                    throw new BuildXLException($"{nameof(RemotingClient)}: Unexpected close during message receive");
                }

                offset += bytesRead;
            }

            return(s_messageEncoding.GetString(m_readBuffer, 0, payloadSize));
        }