Beispiel #1
0
        public RegisteredSocket(RegisteredMultiplexer multiplexer, Socket socket)
        {
            lock (multiplexer.SafeHandle)
            {
                _requestQueue = Interop.Rio.CreateRequestQueue(socket.SafeHandle, multiplexer.SafeHandle, IntPtr.Zero, 1, 1, 1, 1);
            }

            _socket = socket;
        }
        static async Task Main(string[] args)
        {
            using Socket socket = RegisteredSocket.CreateRegisterableSocket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            await socket.ConnectAsync(new DnsEndPoint("microsoft.com", 80));

            Console.WriteLine($"Connected: {socket.LocalEndPoint} -> {socket.RemoteEndPoint}");

            using var bufferPool       = new RegisteredMemoryPool();
            using var multiplexer      = new RegisteredMultiplexer(queueSize: 10);
            using var registeredSocket = new RegisteredSocket(multiplexer, socket);

            await Task.WhenAll(DoSend(), DoReceive()).ConfigureAwait(false);

            async Task DoSend()
            {
                Memory <byte> sendBuffer = bufferPool.Rent(64).Memory;
                int           bytes      = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost: microsoft.com\r\n\r\n", sendBuffer.Span);

                sendBuffer = sendBuffer.Slice(bytes);

                while (sendBuffer.Length != 0)
                {
                    int bytesSent = await registeredSocket.SendAsync(sendBuffer).ConfigureAwait(false);

                    if (bytesSent == 0)
                    {
                        break;
                    }

                    sendBuffer = sendBuffer.Slice(bytesSent);
                }
            }

            async Task DoReceive()
            {
                Memory <byte> recvBuffer = bufferPool.Rent(4096).Memory;

                while (true)
                {
                    int bytesReceived = await registeredSocket.ReceiveAsync(recvBuffer).ConfigureAwait(false);

                    if (bytesReceived == 0)
                    {
                        break;
                    }

                    Console.WriteLine(Encoding.ASCII.GetString(recvBuffer.Span.Slice(bytesReceived)));
                }
            }
        }