Exemple #1
0
        /// <deprecated>
        /// Not used. For reference only.
        /// </deprecated>
        private async void StartPolling1()
        {
            while (true)
            {
                var readResult = await pipeReader.ReadAsync().ConfigureAwait(false);

                ReadOnlySequence <byte> buffer   = readResult.Buffer;
                SequencePosition?       position = buffer.Start;
                var remainingBytes = buffer.Length;
                var writeResult    = (byte)0;
                while (remainingBytes > 0)
                {
                    while (localStackByteCount == 0)
                    {
                        await _tun.executeLwipTask(() => _socket.Output());

                        await localStackBufLock.WaitAsync().ConfigureAwait(false);
                    }
                    var bytesToWriteCount = Math.Min(remainingBytes, localStackByteCount);
                    var chunk             = buffer.Slice(position.Value, bytesToWriteCount);
                    var arr  = chunk.ToArray();
                    var more = remainingBytes != bytesToWriteCount;
                    writeResult = await _tun.executeLwipTask(() => _socket.Send(arr, more));

                    if (writeResult != 0)
                    {
                        OnError?.Invoke(this, writeResult);
                        pipeReader.Complete();
                        return;
                    }
                    remainingBytes -= bytesToWriteCount;
                    position        = buffer.GetPosition(bytesToWriteCount, position.Value);
                    Interlocked.Add(ref localStackByteCount, (int)-bytesToWriteCount);
                }
                pipeReader.AdvanceTo(position.Value, position.Value);
                await _tun.executeLwipTask(() => _socket.Output());

                if (readResult.IsCanceled || readResult.IsCompleted || writeResult != 0)
                {
                    break;
                }
            }
            pipeReader.Complete();
            await _tun.executeLwipTask(() => _socket.Close());

            Debug.WriteLine($"{TcpSocket.ConnectionCount()} connections now");
            LocalDisconnected = true;
            OnFinished(this);
            CheckShutdown();
        }
Exemple #2
0
        private async void StartPolling()
        {
            localStackByteCount = await _tun.executeLwipTask(() => _socket.SendBufferSize);

            while (true)
            {
                var readResult = await pipeReader.ReadAsync().ConfigureAwait(false);

                var buffer = readResult.Buffer;
                if (buffer.Length == 0)
                {
                    break;
                }
                ReadOnlySequence <byte> chunk = buffer.Slice(0, Math.Min(buffer.Length, localStackByteCount));
                var arr         = chunk.ToArray();
                var more        = chunk.Length == localStackByteCount;
                var writeResult = await _tun.executeLwipTask(() => _socket.Send(arr, more));

                if (writeResult != 0)
                {
                    OnError?.Invoke(this, writeResult);
                    pipeReader.Complete();
                    return;
                }
                Interlocked.Add(ref localStackByteCount, (int)-chunk.Length);
                pipeReader.AdvanceTo(chunk.End, chunk.End);
                // await _tun.executeLwipTask(() => _socket.Output());

                if (readResult.IsCanceled || readResult.IsCompleted || writeResult != 0)
                {
                    break;
                }
            }
            pipeReader.Complete();
            await _tun.executeLwipTask(() => _socket.Close());

            Debug.WriteLine($"{TcpSocket.ConnectionCount()} connections now");
            LocalDisconnected = true;
            OnFinished(this);
            CheckShutdown();
        }
 public virtual void Close()
 {
     _tun.executeLwipTask(() => _socket.Close());
     Debug.WriteLine($"{TcpSocket.ConnectionCount()} connections now");
 }
Exemple #4
0
 private void W_EstablishTcp(TcpSocket socket)
 {
     Debug.WriteLine($"{TcpSocket.ConnectionCount()} connections now");
     // ShadowsocksR server with procotol=origin, method=none
     RawShadowsocksAdapter a = new RawShadowsocksAdapter("80.80.80.80", 1234, socket, this);
 }