我现在是打算实现一个类似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的问题也是您回答的,谢谢您.