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(); }
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(); }
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; } }); }