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的问题也是您回答的,谢谢您.

发布了74 篇原创文章 · 获赞 0 · 访问量 3095

猜你喜欢

转载自blog.csdn.net/netyou/article/details/104371596