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