Beispiel #1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="cancellationToken"></param>
        /// <returns>-1 if error.</returns>
        public override async ValueTask <int> WriteAsync(ReadOnlyMemory <byte> buffer, CancellationToken cancellationToken = default)
        {
            if (_closed)
            {
                return(-1);
            }
            UpdateLastActive();

            int written = -1;

            try
            {
                using (var arr = RecyclableByteArray.Rent(buffer.Length))
                {
                    buffer.CopyTo(arr.Array);
                    written = await _sock.SendToAsync(new ArraySegment <byte>(arr.Array), SocketFlags.None, _locker.Number);//TODO waiting for a overload.
                }
            }
            catch (SocketException ex)
            {
                _logger?.LogError($"UdpClient2 SendToAsync error {ex.SocketErrorCode}, {ex.Message}.");
                return(-1);
            }
            catch (Exception ex)
            {
                _logger?.LogError($"UdpClient2 SendToAsync error {ex.Message}.");
                return(-1);
            }
            return(written);
        }
        public void TestArrayPool()
        {
            byte[] arr1 = new byte[16];
            System.Security.Cryptography.RandomNumberGenerator.Fill(arr1);
            Trace.TraceInformation(BitConverter.ToString(arr1).Replace("-", ""));

            var ra1 = RecyclableByteArray.Rent(16);

            arr1.AsSpan().CopyTo(ra1.Array.AsSpan());
            Trace.TraceInformation(BitConverter.ToString(ra1.Array).Replace("-", ""));

            ra1.Dispose();

            var ra2 = RecyclableByteArray.Rent(10);

            Trace.TraceInformation(BitConverter.ToString(ra2.Array).Replace("-", ""));
            Assert.IsTrue(ra2.Array.Length == 16);
            Assert.IsTrue(ra2.Array.AsSpan().SequenceEqual(arr1.AsSpan()));
        }