Ejemplo n.º 1
0
        private void WireStreams(Socket newSocket, Action notifyWhenClosed)
        {
            if (_socket != null)             // reset
            {
                _socketIsClosed = 0;

                // TODO: replace cancellation token in ringbuffers

                // _inputBuffer.Reset();
                // _outputBuffer.Reset();
            }

            _socket           = newSocket;
            _notifyWhenClosed = notifyWhenClosed;

            // WriteLoop
            _socketConsumer = new SocketConsumer(_socket, _outputBuffer, _token, _index);
            _socketConsumer.OnNotifyClosed += OnSocketClosed;

            // ReadLoop
            _socketProducer = new SocketProducer(_socket, _inputBuffer, _token, _index);
            _socketProducer.OnNotifyClosed += OnSocketClosed;

            Writer = new InternalBigEndianWriter(_outputRingBufferStream);
            Reader = new InternalBigEndianReader(_inputRingBufferStream);
//
//			_socketConsumer.Start();
        }
        public SocketRingBuffers(Socket socket, CancellationToken cancellationToken, Action notifyWhenClosed, Action flushWrite)
        {
            _notifyWhenClosed = notifyWhenClosed;

            _inputBuffer = new ByteRingBuffer(cancellationToken);
            _outputBuffer = new ByteRingBuffer(cancellationToken);

            _inputRingBufferStream = new RingBufferStreamAdapter(_inputBuffer);
            _outputRingBufferStream = new RingBufferStreamAdapter(_outputBuffer);

            // WriteLoop
            _socketConsumer = new SocketConsumer(socket, _outputBuffer, cancellationToken, flushWrite);
            _socketConsumer.OnNotifyClosed += OnSocketClosed;

            // ReadLoop
            _socketProducer = new SocketProducer(socket, _inputBuffer, cancellationToken);
            _socketProducer.OnNotifyClosed += OnSocketClosed;

            Writer = new InternalBigEndianWriter(_outputRingBufferStream);
            Reader = new InternalBigEndianReader(_inputRingBufferStream);
        }
        public SocketRingBuffers(Socket socket, CancellationToken cancellationToken, Action notifyWhenClosed, Action flushWrite)
        {
            _notifyWhenClosed = notifyWhenClosed;

            _inputBuffer  = new ByteRingBuffer(cancellationToken);
            _outputBuffer = new ByteRingBuffer(cancellationToken);

            _inputRingBufferStream  = new RingBufferStreamAdapter(_inputBuffer);
            _outputRingBufferStream = new RingBufferStreamAdapter(_outputBuffer);

            // WriteLoop
            _socketConsumer = new SocketConsumer(socket, _outputBuffer, cancellationToken, flushWrite);
            _socketConsumer.OnNotifyClosed += OnSocketClosed;

            // ReadLoop
            _socketProducer = new SocketProducer(socket, _inputBuffer, cancellationToken);
            _socketProducer.OnNotifyClosed += OnSocketClosed;

            Writer = new InternalBigEndianWriter(_outputRingBufferStream);
            Reader = new InternalBigEndianReader(_inputRingBufferStream);
        }
Ejemplo n.º 4
0
		private void WireStreams(Socket newSocket, Action notifyWhenClosed)
		{
			if (_socket != null) // reset
			{
				_socketIsClosed = 0; 

				// TODO: replace cancellation token in ringbuffers

				// _inputBuffer.Reset();
				// _outputBuffer.Reset();
			}

			_socket = newSocket;
			_notifyWhenClosed = notifyWhenClosed;

			// WriteLoop
			_socketConsumer = new SocketConsumer(_socket, _outputBuffer, _token, _index);
			_socketConsumer.OnNotifyClosed += OnSocketClosed;

			// ReadLoop
			_socketProducer = new SocketProducer(_socket, _inputBuffer, _token, _index);
			_socketProducer.OnNotifyClosed += OnSocketClosed;

			Writer = new InternalBigEndianWriter(_outputRingBufferStream);
			Reader = new InternalBigEndianReader(_inputRingBufferStream);
//
//			_socketConsumer.Start();
		}
Ejemplo n.º 5
0
        public void WritesOf31ReadsOf31_BufferOf32()
        {
            var autoResEv = new AutoResetEvent(false);

            Socket acceptedSocket = null;
            var    socketOut      = new Socket(SocketType.Stream, ProtocolType.Tcp);
            var    socketAccept   = new Socket(SocketType.Stream, ProtocolType.Tcp);

            socketAccept.Bind(new IPEndPoint(IPAddress.Any, 6868));

            var socketEvArgs = new SocketAsyncEventArgs();

            socketEvArgs.Completed += (sender, args) =>
            {
                acceptedSocket = args.AcceptSocket;
                autoResEv.Set();
            };
            socketAccept.Listen(1);
            if (!socketAccept.AcceptAsync(socketEvArgs))
            {
                acceptedSocket = socketEvArgs.AcceptSocket;
            }

            socketOut.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
            socketOut.Connect(new IPEndPoint(IPAddress.Loopback, 6868));

            autoResEv.WaitOne();

            acceptedSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);

            var cancellationTokenSrc = new CancellationTokenSource();
            var cancellationToken    = cancellationTokenSrc.Token;

            var inputBuffer  = new ByteRingBuffer(cancellationToken);
            var outputBuffer = new ByteRingBuffer(cancellationToken);

            var inputRingBufferStream  = new RingBufferStreamAdapter(inputBuffer);
            var outputRingBufferStream = new RingBufferStreamAdapter(outputBuffer);

            // WriteLoop
            var socketConsumer = new SocketConsumer(socketOut, outputBuffer, cancellationToken, () =>
            {
            });

            // ReadLoop
            var socketProducer = new SocketProducer(acceptedSocket, inputBuffer, cancellationToken);


            var input  = new byte[1025];
            var output = new byte[1025];

            for (int j = 0; j < input.Length; j++)
            {
                input[j] = (byte)(j % 256);
            }

            for (ulong i = 0L; i < 1000000; i++)
            {
                outputRingBufferStream.Write(input, 0, input.Length);

                var read = inputRingBufferStream.Read(output, 0, output.Length);
                read.Should().Be(output.Length);

                for (int x = 0; x < output.Length; x++)
                {
                    output[x].Should().Be((byte)(x % 256), "Iteration " + i + " pos " + x);
                }

                if (i % 10000 == 0)
                {
                    Console.WriteLine("Iteration " + i);
                }
            }

            cancellationTokenSrc.Cancel();
            socketOut.Close();
            socketAccept.Close();
        }
        public void WritesOf31ReadsOf31_BufferOf32()
        {
            var autoResEv = new AutoResetEvent(false);

            Socket acceptedSocket = null;
            var socketOut = new Socket(SocketType.Stream, ProtocolType.Tcp);
            var socketAccept = new Socket(SocketType.Stream, ProtocolType.Tcp);
            socketAccept.Bind(new IPEndPoint(IPAddress.Any, 6868));

            var socketEvArgs = new SocketAsyncEventArgs();
            socketEvArgs.Completed += (sender, args) =>
            {
                acceptedSocket = args.AcceptSocket;
                autoResEv.Set();
            };
            socketAccept.Listen(1);
            if (!socketAccept.AcceptAsync(socketEvArgs))
            {
                acceptedSocket = socketEvArgs.AcceptSocket;
            }

            socketOut.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
            socketOut.Connect(new IPEndPoint(IPAddress.Loopback, 6868));

            autoResEv.WaitOne();

            acceptedSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);

            var cancellationTokenSrc = new CancellationTokenSource();
            var cancellationToken = cancellationTokenSrc.Token;

            var inputBuffer = new ByteRingBuffer(cancellationToken);
            var outputBuffer = new ByteRingBuffer(cancellationToken);

            var inputRingBufferStream = new RingBufferStreamAdapter(inputBuffer);
            var outputRingBufferStream = new RingBufferStreamAdapter(outputBuffer);

            // WriteLoop
            var socketConsumer = new SocketConsumer(socketOut, outputBuffer, cancellationToken, () =>
            {

            });

            // ReadLoop
            var socketProducer = new SocketProducer(acceptedSocket, inputBuffer, cancellationToken);

            var input = new byte[1025];
            var output = new byte[1025];
            for (int j = 0; j < input.Length; j++)
            {
                input[j] = (byte)(j % 256);
            }

            for (ulong i = 0L; i < 1000000; i++)
            {
                outputRingBufferStream.Write(input, 0, input.Length);

                var read = inputRingBufferStream.Read(output, 0, output.Length);
                read.Should().Be(output.Length);

                for (int x = 0; x < output.Length; x++)
                {
                    output[x].Should().Be((byte)(x % 256), "Iteration " + i + " pos " + x);
                }

                if (i % 10000 == 0)
                {
                    Console.WriteLine("Iteration " + i);
                }
            }

            cancellationTokenSrc.Cancel();
            socketOut.Close();
            socketAccept.Close();
        }