天天看点

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

 我们知道编程的时候使用代理服务器并不是一件爽心悦目的事情,可是很多时候又是迫不得已的

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

。微软在.NET

Framework得System.Net名称空间里给我们提供了一个WebProxy类,不过这是一个http代理,这种代理使用起来受限太多,很不方便。如果我们需要访问更多的网络服务,socks代理是一个理想的选择。下面是C#编写的一个匿名socks5代理使用示例:

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

#region 连接匿名socks5服务器代码

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

private bool ConnectProxyServer(string strRemoteHost, int iRemotePort, Socket sProxyServer)

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

{

在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代理

    {

在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代理
在C#网络编程中使用匿名Socks5代理

        sProxyServer.Close(); 

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

        throw new Exception("代理服务其返回的响应错误。");

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

    if ( bySock5Receive[1]==0 )

在C#网络编程中使用匿名Socks5代理
在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代理

        string []strAryTemp = strIp.Split(new char[] {'.'});

在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代理

        {

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

            sProxyServer.Close();

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

            throw new Exception("第二次连接Socks5代理返回数据出错。");

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

        }

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

        return true ;

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

    else

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

        if ( bySock5Receive[1]==2 ) 

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

            throw new Exception("代理服务器需要进行身份确认。");

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

        else return false ;

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

}

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

#endregion

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

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

private Socket GetSocket(string strIpAdd, int iPort)

在C#网络编程中使用匿名Socks5代理
在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代理