Esempio n. 1
0
        private async Task ListenAsync(PreparePacket prepare, CancellationToken token)
        {
            token.Register(() => _listener?.Close());

            await Task.Run(() =>
            {
                var count  = 0;
                var buffer = new byte[PACKET_SIZE];

                while (!token.IsCancellationRequested)
                {
                    int received      = 0;
                    EndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);

                    try
                    {
                        received = _listener.ReceiveFrom(buffer, count, PACKET_SIZE - count, ref endPoint);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error(ex);
                        break;
                    }

                    if (received == 0)
                    {
                        break;
                    }

                    count += received;

                    int offset   = 0;
                    int position = 0;

                    prepare?.Invoke((IPEndPoint)endPoint, buffer, ref offset, count);

                    while (offset > position)
                    {
                        var packet = new ArraySegment <byte>(buffer, position, offset - position);

                        if (_logger.IsTraceEnabled)
                        {
                            _logger.Trace("Received packet: " + BitConverter.ToString(packet.ToArray()));
                        }

                        position += offset;
                    }

                    count -= offset;
                    if (count > 0)
                    {
                        Buffer.BlockCopy(buffer, offset, buffer, 0, count);
                    }
                }
            },
                           token);

            FreeToken();
            FreeSocket();
        }
Esempio n. 2
0
        public async Task ListenAsync(PreparePacket prepare, CancellationToken token)
        {
            await Task.Run(() =>
            {
                var count  = 0;
                var buffer = new byte[PACKET_SIZE];

                while (!token.IsCancellationRequested)
                {
                    int received = 0;

                    try
                    {
                        received = _stream.Read(buffer, count, PACKET_SIZE - count);
                    }
                    catch (Exception ex)
                    {
                        _logger.Error(ex);
                        break;
                    }

                    if (received == 0)
                    {
                        break;
                    }

                    count += received;

                    int offset = 0;
                    prepare?.Invoke(RemoteEndPoint, buffer, ref offset, count);

                    count -= offset;
                    if (count > 0)
                    {
                        Buffer.BlockCopy(buffer, offset, buffer, 0, count);
                    }
                }
            },
                           token);

            Closing?.Invoke(this);

            FreeStream();
            FreeSocket();
        }
Esempio n. 3
0
        public void Connection(IPAddress address, int port)
        {
            if (_socket != null)
            {
                return;
            }

            _ = Task.Run(async() =>
            {
                _cancellation = new CancellationTokenSource();
                _cancellation.Token.Register(() => _socket?.Close());

                try
                {
                    while (!_cancellation.Token.IsCancellationRequested)
                    {
                        try
                        {
                            _socket = _factory();
                            _socket.Connect(address, port);

                            int remain   = 0;
                            int received = 0;

                            var buffer = new byte[ushort.MaxValue];

                            while (!_cancellation.Token.IsCancellationRequested)
                            {
                                received = _socket.Receive(buffer, remain, buffer.Length - remain, SocketFlags.None);

                                if (received == 0)
                                {
                                    break;
                                }

                                remain    += received;
                                int offset = 0;

                                PreparePacket?.Invoke(buffer, ref offset, remain);

                                remain -= offset;
                                if (remain > 0)
                                {
                                    Buffer.BlockCopy(buffer, offset, buffer, 0, remain);
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex);
                        }
                        finally
                        {
                            _socket?.Dispose();
                            _socket = null;
                        }

                        _cancellation.Token.ThrowIfCancellationRequested();
                        await Task.Delay(1500);
                    }
                }
                finally
                {
                    _cancellation.Dispose();
                    _cancellation = null;
                }
            });
        }