我们知道编程的时候使用代理服务器并不是一件爽心悦目的事情,可是很多时候又是迫不得已的在C#网络编程中使用匿名Socks5代理。微软在.NET Framework得System.Net名称空间里给我们提供了一个WebProxy类,不过这是一个http代理,这种代理使用起来受限太多,很不方便。如果我们需要访问更多的网络服务,socks代理是一个理想的选择。下面是C#编写的一个匿名socks5代理使用示例:


在C#网络编程中使用匿名Socks5代理private bool ConnectProxyServer(string strRemoteHost, int iRemotePort, Socket sProxyServer)
{
在C#网络编程中使用匿名Socks5代理    
//构造Socks5代理服务器第一连接头(无用户名密码)
在C#网络编程中使用匿名Socks5代理
    byte[] bySock5Send = new Byte[10];
在C#网络编程中使用匿名Socks5代理    bySock5Send[
0= 5;
在C#网络编程中使用匿名Socks5代理    bySock5Send[
1= 1;
在C#网络编程中使用匿名Socks5代理    bySock5Send[
2= 0;
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理    
//发送Socks5代理第一次连接信息
在C#网络编程中使用匿名Socks5代理
    sProxyServer.Send(bySock5Send, 3, SocketFlags.None);
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理    
byte[] bySock5Receive = new byte[10];
在C#网络编程中使用匿名Socks5代理    
int iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理    
if ( iRecCount<2 ) 
{
在C#网络编程中使用匿名Socks5代理        sProxyServer.Close();
在C#网络编程中使用匿名Socks5代理        
throw new Exception("不能获得代理服务器正确响应。");
在C#网络编程中使用匿名Socks5代理    }

在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理    
if ( bySock5Receive[0]!=5 || ( bySock5Receive[1]!=0 && bySock5Receive[1]!=2 ) )
{
在C#网络编程中使用匿名Socks5代理        sProxyServer.Close(); 
在C#网络编程中使用匿名Socks5代理        
throw new Exception("代理服务其返回的响应错误。");
在C#网络编程中使用匿名Socks5代理    }

在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理    
if ( bySock5Receive[1]==0 )
{
在C#网络编程中使用匿名Socks5代理        bySock5Send[
0= 5;
在C#网络编程中使用匿名Socks5代理        bySock5Send[
1= 1;
在C#网络编程中使用匿名Socks5代理        bySock5Send[
2= 0;
在C#网络编程中使用匿名Socks5代理        bySock5Send[
3= 1;
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理        IPAddress ipAdd 
= Dns.Resolve(strRemoteHost).AddressList[0];
在C#网络编程中使用匿名Socks5代理        
string strIp = ipAdd.ToString();
);
在C#网络编程中使用匿名Socks5代理        bySock5Send[
4= Convert.ToByte(strAryTemp[0]);
在C#网络编程中使用匿名Socks5代理        bySock5Send[
5= Convert.ToByte(strAryTemp[1]);
在C#网络编程中使用匿名Socks5代理        bySock5Send[
6= Convert.ToByte(strAryTemp[2]);
在C#网络编程中使用匿名Socks5代理        bySock5Send[
7= Convert.ToByte(strAryTemp[3]);
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理        bySock5Send[
8= (byte)(iRemotePort/256);
在C#网络编程中使用匿名Socks5代理        bySock5Send[
9= (byte)(iRemotePort%256);
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理        sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None);
在C#网络编程中使用匿名Socks5代理        iRecCount 
= sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理        
if ( bySock5Receive[0]!=5 || bySock5Receive[1]!=0 )
{
在C#网络编程中使用匿名Socks5代理            sProxyServer.Close();
在C#网络编程中使用匿名Socks5代理            
throw new Exception("第二次连接Socks5代理返回数据出错。");
在C#网络编程中使用匿名Socks5代理        }

在C#网络编程中使用匿名Socks5代理        return true ;
在C#网络编程中使用匿名Socks5代理    }

在C#网络编程中使用匿名Socks5代理    
else
{
在C#网络编程中使用匿名Socks5代理        
if ( bySock5Receive[1]==2 ) 
在C#网络编程中使用匿名Socks5代理            
throw new Exception("代理服务器需要进行身份确认。");
在C#网络编程中使用匿名Socks5代理        
else return false ;
在C#网络编程中使用匿名Socks5代理    }

在C#网络编程中使用匿名Socks5代理}

在C#网络编程中使用匿名Socks5代理
#endregion

   关于socks5代理的详细文档,可以参看RFC 1928

   使用上面的代码需要有一个匿名的socks5代理服务器,然后调用:

在C#网络编程中使用匿名Socks5代理private Socket GetSocket(string strIpAdd, int iPort)
{
在C#网络编程中使用匿名Socks5代理    IPAddress hostadd 
= Dns.Resolve(strIpAdd).AddressList[0];
在C#网络编程中使用匿名Socks5代理    IPEndPoint EPhost 
= new IPEndPoint(hostadd, iPort);
在C#网络编程中使用匿名Socks5代理    Socket s 
= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
在C#网络编程中使用匿名Socks5代理    s.Connect(EPhost);
在C#网络编程中使用匿名Socks5代理    
return s ;
在C#网络编程中使用匿名Socks5代理}

在C#网络编程中使用匿名Socks5代理
在C#网络编程中使用匿名Socks5代理sRemoteHost 
= GetSocket(proxyHost, proxyProt);
在C#网络编程中使用匿名Socks5代理ConnectProxyServer(
"61.135.134.24"80
, sRemoteHost);
在C#网络编程中使用匿名Socks5代理

   如果您需要使用非匿名的socks5代理,把RFC 1928后面关于用户验证的部分实现就可以了,由于我使用的都是匿名的socks5代理,所以没有做这个部分得工作在C#网络编程中使用匿名Socks5代理

相关文章:

  • 2021-11-13
  • 2022-12-23
  • 2021-06-11
  • 2022-12-23
  • 2021-12-10
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-02
  • 2022-12-23
  • 2021-12-02
  • 2021-12-04
相关资源
相似解决方案