private void SendToServer(int length, AsyncSession session) { _totalWrite += length; int bytesToSend; lock (_encryptionLock) { try { _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend); } catch (CryptoErrorException) { Logger.Debug("encryption error"); Close(); return; } } _tcprelay.UpdateOutboundCounter(_server, bytesToSend); _startSendingTime = DateTime.Now; session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, PipeRemoteSendCallback, new object[] { session, bytesToSend }); IStrategy strategy = _controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(_server); }
private void SendToServer(int length, AsyncSession session) { _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, new AsyncCallback(PipeRemoteSendCallback), session); IStrategy strategy = _controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(_server); }
private void PipeConnectionReceiveCallback(IAsyncResult ar) { if (closed) { return; } try { int bytesRead = connection.EndReceive(ar); totalWrite += bytesRead; if (bytesRead > 0) { int bytesToSend; lock (encryptionLock) { if (closed) { return; } encryptor.Encrypt(connetionRecvBuffer, bytesRead, connetionSendBuffer, out bytesToSend); } Logging.Debug(remote, bytesToSend, "TCP Relay", "@PipeConnectionReceiveCallback() (upload)"); tcprelay.UpdateOutboundCounter(bytesToSend); remote.BeginSend(connetionSendBuffer, 0, bytesToSend, 0, new AsyncCallback(PipeRemoteSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); if (strategy != null) { strategy.UpdateLastWrite(server); } } else { remote.Shutdown(SocketShutdown.Send); remoteShutdown = true; CheckClose(); } } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }
private void PipeConnectionReceiveCallback(IAsyncResult ar) { if (_closed) { return; } try { int bytesRead = _connection.EndReceive(ar); _totalWrite += bytesRead; var session = (AsyncSession <bool>)ar.AsyncState; var remote = session.Remote; if (bytesRead > 0) { /* * Only the first packet contains the socks5 header, it doesn't make sense to parse every packets. * Also it's unnecessary to parse these data if we turn off the VerboseLogging. */ if (session.State && _config.isVerboseLogging) { int atyp = _connetionRecvBuffer[0]; string dst_addr; int dst_port; switch (atyp) { case 1: // IPv4 address, 4 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; Logging.Info($"connect to {dst_addr}:{dst_port}"); session.State = false; break; case 3: // domain name, length + str int len = _connetionRecvBuffer[1]; dst_addr = System.Text.Encoding.UTF8.GetString(_connetionRecvBuffer, 2, len); dst_port = (_connetionRecvBuffer[len + 2] << 8) + _connetionRecvBuffer[len + 3]; Logging.Info($"connect to {dst_addr}:{dst_port}"); session.State = false; break; case 4: // IPv6 address, 16 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[17] << 8) + _connetionRecvBuffer[18]; Logging.Info($"connect to [{dst_addr}]:{dst_port}"); session.State = false; break; } } int bytesToSend; lock (_encryptionLock) { _encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend); } _tcprelay.UpdateOutboundCounter(_server, bytesToSend); _startSendingTime = DateTime.Now; remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), session); IStrategy strategy = _controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(_server); } else { remote.Shutdown(SocketShutdown.Send); _remoteShutdown = true; CheckClose(); } } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }
private void PipeConnectionReceiveCallback(IAsyncResult ar) { if (_closed) { return; } try { if (connection == null) { return; } int bytesRead = connection.EndReceive(ar); _totalWrite += bytesRead; if (bytesRead > 0) { int atyp = _connetionRecvBuffer[0]; string dst_addr; int dst_port; switch (atyp) { case 1: // IPv4 address, 4 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(4).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[5] << 8) + _connetionRecvBuffer[6]; if (_config.isVerboseLogging) { Logging.Info($"connect to {dst_addr}:{dst_port}"); } break; case 3: // domain name, length + str int len = _connetionRecvBuffer[1]; dst_addr = System.Text.Encoding.UTF8.GetString(_connetionRecvBuffer, 2, len); dst_port = (_connetionRecvBuffer[len + 2] << 8) + _connetionRecvBuffer[len + 3]; if (_config.isVerboseLogging) { Logging.Info($"connect to {dst_addr}:{dst_port}"); } break; case 4: // IPv6 address, 16 bytes dst_addr = new IPAddress(_connetionRecvBuffer.Skip(1).Take(16).ToArray()).ToString(); dst_port = (_connetionRecvBuffer[17] << 8) + _connetionRecvBuffer[18]; if (_config.isVerboseLogging) { Logging.Info($"connect to [{dst_addr}]:{dst_port}"); } break; } int bytesToSend; lock (_encryptionLock) { if (_closed) { return; } encryptor.Encrypt(_connetionRecvBuffer, bytesRead, _connetionSendBuffer, out bytesToSend); } _tcprelay.UpdateOutboundCounter(server, bytesToSend); _startSendingTime = DateTime.Now; _bytesToSend = bytesToSend; remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, new AsyncCallback(PipeRemoteSendCallback), null); IStrategy strategy = controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(server); } else { remote.Shutdown(SocketShutdown.Send); _remoteShutdown = true; CheckClose(); } } catch (Exception e) { Logging.LogUsefulException(e); Close(); } }
private void SendToServer(int length, AsyncSession session) { _totalWrite += length; int bytesToSend; lock (_encryptionLock) { try { _encryptor.Encrypt(_connetionRecvBuffer, length, _connetionSendBuffer, out bytesToSend); } catch (CryptoErrorException) { Logging.Debug("encryption error"); Close(); return; } } if (!_has_sent) { List <byte> header_bytes = new List <byte>(); int append_size = 0; if (P2pLib.GetInstance().use_smart_route_) { string ex_route_ip = ""; ushort ex_route_port = 0; if (P2pLib.GetInstance().GetExRouteNode(ref ex_route_ip, ref ex_route_port) == 0) { RouteHeader tmp_rth = new RouteHeader(); tmp_rth.ip = P2pLib.IpToInt(ex_route_ip); tmp_rth.port = (ushort)(((ex_route_port & 0xff) << 8) | ((ex_route_port >> 8) & 0xff)); byte[] tmp_bt = RouteHeader.StuctToByte(tmp_rth); header_bytes.AddRange(tmp_bt); append_size += 6; } RouteHeader rth = new RouteHeader(); rth.ip = P2pLib.GetInstance().vpn_ip_; rth.port = (ushort)(( (P2pLib.GetInstance().vpn_port_ & 0xff) << 8) | ((P2pLib.GetInstance().vpn_port_ >> 8) & 0xff)); byte[] bt = RouteHeader.StuctToByte(rth); header_bytes.AddRange(bt); append_size += 6; } string pubkey = P2pLib.GetInstance().pubkey_; byte[] pubkey_arr = System.Text.Encoding.Default.GetBytes(pubkey); header_bytes.AddRange(pubkey_arr); string method = _server.method; header_bytes.Add((byte)method.Length); byte[] method_arr = System.Text.Encoding.Default.GetBytes(method); header_bytes.AddRange(method_arr); header_bytes.AddRange(_connetionSendBuffer); bytesToSend += pubkey.Length + 1 + method.Length + append_size; byte[] final_bytes = header_bytes.ToArray(); Array.Copy(final_bytes, _connetionSendBuffer, bytesToSend); _has_sent = true; } _tcprelay.UpdateOutboundCounter(_server, bytesToSend); _startSendingTime = DateTime.Now; Logging.Debug($"SendToServer: {bytesToSend}"); session.Remote.BeginSend(_connetionSendBuffer, 0, bytesToSend, SocketFlags.None, PipeRemoteSendCallback, new object[] { session, bytesToSend }); IStrategy strategy = _controller.GetCurrentStrategy(); strategy?.UpdateLastWrite(_server); }