Ejemplo n.º 1
0
        protected void BeginSendToServer(int length, AsyncSession session, AsyncCallback callback)
        {
            if (!_serverHeaderSent)
            {
                _serverHeaderSent = true;

                // Append socks5 header
                int len = Socks5Util.HeaderAddrLength(_destEndPoint);
                Array.Copy(ConnetionRecvBuffer, 0, ConnetionRecvBuffer, len, length);
                Socks5Util.FillHeaderAddr(ConnetionRecvBuffer, 0, _destEndPoint);

                length += len;
            }

            _totalWrite += length;
            int bytesToSend;

            lock (_encryptionLock)
            {
                _encryptor.Encrypt(ConnetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend);
            }
            _tcprelay.UpdateOutboundCounter(_server, bytesToSend);
            _startSendingTime = DateTime.Now;
            session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, callback, session);
            IStrategy strategy = _controller.GetCurrentStrategy();

            strategy?.UpdateLastWrite(_server);
        }
Ejemplo n.º 2
0
        public void BeginConnectDest(EndPoint destEndPoint, AsyncCallback callback, object state)
        {
            DestEndPoint = destEndPoint;

            int len = Socks5Util.HeaderAddrLength(destEndPoint);

            byte[] request = new byte[len + 3];
            Socks5Util.FillHeaderAddr(request, 3, destEndPoint);

            // 构造request包剩余部分
            request[0] = 5;
            request[1] = 1;
            request[2] = 0;

            var st = new Socks5State();

            st.Callback   = callback;
            st.AsyncState = state;

            _remote.BeginSend(request, 0, request.Length, 0, Socks5RequestSendCallback, st);
        }