public async Task <Result <MessageData> > ReceiveMessageAsync()
        {
            byte[]      data  = new byte[CliServDefaults.BufferSize];
            MessageData mData = null;

            try
            {
                var recvResult = await _clientSocket.ReceiveWithTimeoutAsync(
                    data,
                    0,
                    data.Length,
                    SocketFlags.None,
                    ReceiveTypeEnum.ReceiveTypeDelay,
                    // Wait forever
                    -1
                    )
                                 .ConfigureAwait(false);

                if (recvResult.Value > 0)
                {
                    mData = SerializeDeserialize.DeserializeFromByteArray <MessageData>(data);
                }
                return(Result.Ok(mData));
            }
            catch (SocketException e)
            {
                throw;
            }
        }
        public async Task <Result <string> > SendMessageAsync(object message)
        {
            // Encode a string message before sending it to the server
            var messageData = SerializeDeserialize.SerializeToByteArray(message);

            // Send it away
            var sendResult =
                await _clientSocket.SendWithTimeoutAsync(
                    messageData,
                    0,
                    messageData.Length,
                    0,
                    SendTypeEnum.SendTypeCycle,
                    CliServDefaults.SendTimeoutMs
                    )
                .ConfigureAwait(false);

            // If Task did not complete successfully, report the error
            if (sendResult.Failure)
            {
                return(Result.Fail <string>("There was an error sending data to the server"));
            }
            // Sent
            return(Result.Ok("Message sent."));
        }