在C#网络编程中使用匿名Socks5代理-阿里云开发者社区

开发者社区> 唐玄奘> 正文

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

简介:
+关注继续查看

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

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

InBlock.gif
InBlock.gif    if ( bySock5Receive[0]!=5 || ( bySock5Receive[1]!=0 && bySock5Receive[1]!=2 ) )
ExpandedSubBlockStart.gif    {
InBlock.gif        sProxyServer.Close(); 
InBlock.gif        throw new Exception("代理服务其返回的响应错误。");
ExpandedSubBlockEnd.gif    }

InBlock.gif
InBlock.gif    if ( bySock5Receive[1]==0 )
ExpandedSubBlockStart.gif    {
InBlock.gif        bySock5Send[0] = 5;
InBlock.gif        bySock5Send[1] = 1;
InBlock.gif        bySock5Send[2] = 0;
InBlock.gif        bySock5Send[3] = 1;
InBlock.gif
InBlock.gif        IPAddress ipAdd = Dns.Resolve(strRemoteHost).AddressList[0];
InBlock.gif        string strIp = ipAdd.ToString();
ExpandedSubBlockStart.gif        string []strAryTemp = strIp.Split(new char[] {'.'});
InBlock.gif        bySock5Send[4] = Convert.ToByte(strAryTemp[0]);
InBlock.gif        bySock5Send[5] = Convert.ToByte(strAryTemp[1]);
InBlock.gif        bySock5Send[6] = Convert.ToByte(strAryTemp[2]);
InBlock.gif        bySock5Send[7] = Convert.ToByte(strAryTemp[3]);
InBlock.gif
InBlock.gif        bySock5Send[8] = (byte)(iRemotePort/256);
InBlock.gif        bySock5Send[9] = (byte)(iRemotePort%256);
InBlock.gif
InBlock.gif        sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None);
InBlock.gif        iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
InBlock.gif
InBlock.gif        if ( bySock5Receive[0]!=5 || bySock5Receive[1]!=0 )
ExpandedSubBlockStart.gif        {
InBlock.gif            sProxyServer.Close();
InBlock.gif            throw new Exception("第二次连接Socks5代理返回数据出错。");
ExpandedSubBlockEnd.gif        }

InBlock.gif        return true ;
ExpandedSubBlockEnd.gif    }

InBlock.gif    else
ExpandedSubBlockStart.gif    {
InBlock.gif        if ( bySock5Receive[1]==2 ) 
InBlock.gif            throw new Exception("代理服务器需要进行身份确认。");
InBlock.gif        else return false ;
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif#endregion

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

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

None.gifprivate Socket GetSocket(string strIpAdd, int iPort)
ExpandedBlockStart.gif{
InBlock.gif    IPAddress hostadd = Dns.Resolve(strIpAdd).AddressList[0];
InBlock.gif    IPEndPoint EPhost = new IPEndPoint(hostadd, iPort);
InBlock.gif    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
InBlock.gif    s.Connect(EPhost);
InBlock.gif    return s ;
ExpandedBlockEnd.gif}

None.gif
None.gifsRemoteHost = GetSocket(proxyHost, proxyProt);
None.gifConnectProxyServer("61.135.134.24", 80
, sRemoteHost);
None.gif

   如果您需要使用非匿名的socks5代理,把RFC 1928后面关于用户验证的部分实现就可以了,由于我使用的都是匿名的socks5代理,所以没有做这个部分得工作emembarrassed.gif

    

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python编程:使用cachy缓存数据
Python编程:使用cachy缓存数据
12 0
《C语言编程初学者指南》一1.3 使用注释
本节书摘来自华章出版社《C语言编程初学者指南》一书中的第1章,第1.3节,作者【美】Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看 1.3 使用注释 在任何编程语言中,注释都是程序代码的一个组成部分。
1348 0
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
Excel 宏编程-使用excel宏编写第一个Hello World程序实例演示!
9 0
使用c#制作网络爬虫,检查站点可访问性
  前几天自己负责的网站出现了不能访问的问题,系统监控程序通过告警将这一信息告诉了管理员。管理员找到了我,告诉我站点不能正常访问。后来问题查明,是负载均衡器出了问题。自己在检查站点的时候,发现有些图片不能正确显示,原因是图片链接无效。
754 0
《C语言编程初学者指南》一1.6 使用指令
本节书摘来自华章出版社《C语言编程初学者指南》一书中的第1章,第1.6节,作者【美】Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看 1.6 使用指令 下面再看看本章一开始给出的示例程序。
1200 0
+关注
641
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载