public static Client Build()
        {
#pragma warning disable 1998
            var handler = new ManagedHandler(async(string host, int port, CancellationToken cancellationToken) =>
#pragma warning restore 1998
            {
#if UNITY_EDITOR_WIN
                var pipe = new NamedPipeClientStream(".", "docker_engine", PipeDirection.InOut, PipeOptions.Asynchronous);
                try
                {
                    pipe.Connect(5000);
                }
                catch (Exception e)
                {
                    throw new DockerConnectException(e);
                }

                return(new DockerPipeStream(pipe));
#else
                var sock = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.Unspecified);
                try {
                    await SocketTaskExtensions.ConnectAsync(sock, new UnixDomainSocketEndPoint("/var/run/docker.sock"));
                }
                catch (Exception e)
                {
                    throw new DockerConnectException(e);
                }
                return(sock);
#endif
            });

            var httpClient = new HttpClient(handler);
            var docker     = new Client("http://docker_engine", httpClient);
            return(docker);
        }
        public static Task <int> ReceiveAsync(this Socket socket, Memory <byte> memory, SocketFlags socketFlags)
        {
            if (!MemoryMarshal.TryGetArray((ReadOnlyMemory <byte>)memory, out var segment))
            {
                throw new InvalidOperationException("Buffer backed by array was expected.");
            }

            return(SocketTaskExtensions.ReceiveAsync(socket, segment, socketFlags));
        }
Example #3
0
        public static async ValueTask <int> SendAsync(this Socket socket, ReadOnlyMemory <byte> buffer, SocketFlags socketFlags)
        {
            if (MemoryMarshal.TryGetArray(buffer, out var segment))
            {
                return(await SocketTaskExtensions.SendAsync(socket, segment, socketFlags));
            }

            using (var rentedBuffer = new RentedBuffer <byte>(buffer.Length))
            {
                buffer.CopyTo(rentedBuffer);
                return(await SocketTaskExtensions.SendAsync(socket, rentedBuffer.Segment, socketFlags));
            }
        }
Example #4
0
        public async Task EnsureMethodsAreCallable()
        {
            // The purpose of this test is just to ensure that the now-hidden extension methods in SocketTaskExtensions are
            // properly invoking the underlying instance methods, and not accidentally binding to themselves, causing infinite recursion.
            Socket     s           = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPEndPoint badEndPoint = new IPEndPoint(IPAddress.None, 0);
            string     badHostName = "nosuchhost.invalid";

            byte[] buffer = new byte[1];

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await SocketTaskExtensions.AcceptAsync(s));

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await SocketTaskExtensions.AcceptAsync(s, null));

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await SocketTaskExtensions.ReceiveFromAsync(s, new ArraySegment <byte>(buffer), SocketFlags.None, badEndPoint));

            await Assert.ThrowsAsync <InvalidOperationException>(async() => await SocketTaskExtensions.ReceiveMessageFromAsync(s, new ArraySegment <byte>(buffer), SocketFlags.None, badEndPoint));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badEndPoint));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badEndPoint, CancellationToken.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badEndPoint.Address, badEndPoint.Port));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badEndPoint.Address, badEndPoint.Port, CancellationToken.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, new IPAddress[] { badEndPoint.Address, badEndPoint.Address }, badEndPoint.Port));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, new IPAddress[] { badEndPoint.Address, badEndPoint.Address }, badEndPoint.Port, CancellationToken.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badHostName, badEndPoint.Port));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ConnectAsync(s, badHostName, badEndPoint.Port, CancellationToken.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ReceiveAsync(s, new ArraySegment <byte>(buffer), SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ReceiveAsync(s, buffer.AsMemory(), SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.ReceiveAsync(s, new ArraySegment <byte>[] { new ArraySegment <byte>(buffer) }, SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.SendAsync(s, new ArraySegment <byte>(buffer), SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.SendAsync(s, buffer.AsMemory(), SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.SendAsync(s, new ArraySegment <byte>[] { new ArraySegment <byte>(buffer) }, SocketFlags.None));

            await Assert.ThrowsAsync <SocketException>(async() => await SocketTaskExtensions.SendToAsync(s, new ArraySegment <byte>(buffer), SocketFlags.None, badEndPoint));
        }
Example #5
0
        //写入循环
        private async Task FillPipeAsync(Socket socket, PipeWriter writer)
        {
            //数据流量比较大,用8k作为buffer
            const int minimumBufferSize = 1024 * 8;

            while (running)
            {
                try
                {
                    //从writer中,获得一段不少于指定大小的内存空间
                    Memory <byte> memory = writer.GetMemory(minimumBufferSize);
                    await socket.ReceiveAsync(memory, SocketFlags.None);

                    //将内存空间变成ArraySegment,提供给socket使用
                    if (!MemoryMarshal.TryGetArray((ReadOnlyMemory <byte>)memory, out ArraySegment <byte> arraySegment))
                    {
                        throw new InvalidOperationException("Buffer backed by array was expected");
                    }
                    //接受数据
                    int bytesRead = await SocketTaskExtensions.ReceiveAsync(socket, arraySegment, SocketFlags.None);

                    if (bytesRead == 0)
                    {
                        break;
                    }

                    //一次接受完毕,数据已经在pipe中,告诉pipe已经给它写了多少数据。
                    writer.Advance(bytesRead);
                }
                catch
                {
                    break;
                }

                // 提示reader可以进行读取数据,reader可以继续执行readAsync()方法
                FlushResult result = await writer.FlushAsync();

                if (result.IsCompleted)
                {
                    break;
                }
            }

            // 告诉pipe完事了
            writer.Complete();
        }
        public static async Task <int> SendBuffersAsync(this Socket socket, IEnumerable <ReadOnlyMemory <byte> > buffers, SocketFlags socketFlags, CancellationToken token)
        {
            socket.Required(nameof(socket));
            var total = 0;

            foreach (var buffer in buffers.Required(nameof(buffers)))
            {
                var expected = buffer.Length;
                var sent     = await SocketTaskExtensions.SendAsync(socket, buffer, socketFlags, token);

                total += sent;
                if (sent < expected)
                {
                    break;
                }
            }
            return(total);
        }
Example #7
0
        private void ProcessLine(ReadOnlySequence <byte> seq)
        {
            var str = Encoding.UTF8.GetString(seq.ToArray());

            Console.WriteLine($"{str}");
            var reader  = new SequenceReader <byte>(seq);
            var command = new ReadOnlySpan <byte>();

            var pingCommand = Encoding.ASCII.GetBytes("PING");
            var pongCommand = Encoding.ASCII.GetBytes("PONG ");
            var crLf        = new byte[] { 13, 10 };

            if (reader.TryReadTo(out command, 32, advancePastDelimiter: true))
            {
                if (command.SequenceEqual(pingCommand))
                {
                    var buffers = new ArraySegment <byte>[] { pongCommand, seq.Slice(reader.Position).ToArray(), crLf };
                    SocketTaskExtensions.SendAsync(_socket, buffers, SocketFlags.None);
                }
            }
        }
Example #8
0
 static Func <IPEndPoint, CancellationToken, Task> ConnectAsyncHelper(Socket socket) => (e, ct) => SocketTaskExtensions.ConnectAsync(socket, e, ct).AsTask();
Example #9
0
        public static Task <int> ReceiveAsync(this Socket socket, Memory <byte> memory, SocketFlags socketFlags)
        {
            var arraySegment = GetArray(memory);

            return(SocketTaskExtensions.ReceiveAsync(socket, arraySegment, socketFlags));
        }
 public static ValueTask <int> SendAsync(this Socket socket, ReadOnlyMemory <byte> buffer, SocketFlags socketFlags, CancellationToken token)
 => SocketTaskExtensions.SendAsync(socket, buffer, socketFlags, token);
 public static ValueTask <int> ReceiveAsync(this Socket socket, Memory <byte> memory, SocketFlags socketFlags, CancellationToken token)
 => SocketTaskExtensions.ReceiveAsync(socket, memory, socketFlags, token);