Socks代理如果加密转发如何解决

我现在是打算实现一个类似SS(酸酸)的代理,然后现在不开启加密的情况下客户端和服务端都正常(代码如下)
Server上的接收回调函数

        private void TCP_Proxy_Receive(IAsyncResult ar)
        {
            try
            {
                byte[] Data = Proxy_Data.Take(Proxy_Stream.EndRead(ar)).ToArray();
                if (Data.Length > 0)
                {
                    TCP_Socks_Send(Client_Stream,Data);
                    Proxy_Stream.BeginRead(Proxy_Data, 0, Data_Size, TCP_Proxy_Receive, null);
                }
                else
                {
                    close();
                }

            }
            catch
            {
                close();
            }
        }

Client上的接受回调函数

        private void Proxy_Read(IAsyncResult ar)
        {
            try
            {
                byte[] Data = Proxy_Data.Take(TCP_Proxy.GetStream().EndRead(ar)).ToArray();
                if (Data.Length > 0)
                {
                    TCP_Send(TCP_Client,Data);
                    TCP_Proxy.GetStream().BeginRead(Proxy_Data, 0, Proxy_Data.Length, Proxy_Read,null);
                }

            }
            catch (Exception)
            {
                Dispose();
            }
        }

这种情况下使用代理是正常的.

.但是只要稍微对传输的数据做一点点修改,很多网站的显示就会出现问题,

开始我有怀疑是不是加解密函数的问题,但是我更换过几次后发现并不相关,哪怕我替换成最基本的添加一个字节(加密)和去掉一个字节(解密)也会出现这个问题,代码如下
Server:

private void TCP_Proxy_Receive(IAsyncResult ar)
        {
            try
            {
                byte[] Data = Proxy_Data.Take(Proxy_Stream.EndRead(ar)).ToArray();
                if (Data.Length > 0)
                {
                    Data = Data.Concat(new byte[] { 1 }).ToArray();
                    TCP_Socks_Send(Client_Stream,Data);
                    Proxy_Stream.BeginRead(Proxy_Data, 0, Data_Size, TCP_Proxy_Receive, null);
                }
                else
                {
                    close();
                }

            }
            catch
            {
                close();
            }
        }

Client:

        private void Proxy_Read(IAsyncResult ar)
        {
            try
            {
                byte[] Data = Proxy_Data.Take(TCP_Proxy.GetStream().EndRead(ar)).ToArray();
                if (Data.Length > 0)
                {
                    Data = Data.Take(Data.Length-1).ToArray();
                    TCP_Send(TCP_Client,Data);
                    TCP_Proxy.GetStream().BeginRead(Proxy_Data, 0, Proxy_Data.Length, Proxy_Read,null);
                }

            }
            catch (Exception)
            {
                Dispose();
            }
        }

这个问题困扰我两三天了,不然也不会发上来求助大家了,太痛苦了.这里先小蜜蜂论坛回帖机谢谢各位大佬了.

TCP传输应该理解为数据流。一次发送,不总是对应一次接收。
具体说,TCP_Proxy_Receive处理1000个字节,可能Proxy_Read收到250个字节,可能Proxy_Read收到1033个字节。

如果你加解密假定发送和接收是一样的字节,就会出错。

查了一下貌似您说的是TCP的分包粘包的处置吧.我大概猜到问题出在哪里了,谢谢大佬,好像上次提的一个关于socket的问题也是您回答的,谢谢您.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!如果您想在使用 QWebEngineView 进行网络请求时使用 SOCKS 代理,可以按照以下步骤进行设置: 1. 首先,您需要在项目中添加 QtNetwork 模块的依赖。在您的 .pro 文件中添加以下行: ``` QT += network ``` 2. 在代码中创建一个 QNetworkProxy 对象,并将其设置为 QWebEngineProfile 的代理。这将确保 QWebEngineView 使用指定的代理进行网络请求。下面是一个示例: ```cpp #include <QApplication> #include <QWebEngineProfile> #include <QNetworkProxy> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个 QNetworkProxy 对象 QNetworkProxy proxy; proxy.setType(QNetworkProxy::Socks5Proxy); // 设置代理类型为 SOCKS5 proxy.setHostName("127.0.0.1"); // 设置代理服务器的主机名 proxy.setPort(1080); // 设置代理服务器的端口号 // 获取默认的 QWebEngineProfile 对象并设置代理 QWebEngineProfile *profile = QWebEngineProfile::defaultProfile(); profile->setHttpProxy(proxy); profile->setHttpsProxy(proxy); // 创建并显示 QWebEngineView QWebEngineView view; view.load(QUrl("https://www.example.com")); view.show(); return app.exec(); } ``` 请注意,上述示例中的代理配置仅适用于 SOCKS5 代理,如果您使用其他类型的代理,请相应更改 setType() 方法的参数。 3. 编译并运行您的应用程序,此时 QWebEngineView 应该会通过指定的 SOCKS 代理进行网络请求。 希望这能帮到您!如果您有任何进一步的问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值