首页 新闻 会员 周边

C# Socket 怎么通过Http代理访问网页

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-09 16:50

用 socket 访问 http代理服务器,怎么用账号和密码获取服务器的验证?怎么访问网页?

我找了份源码,但没有获取服务器验证的功能,试了很多方法,找了很多网站都没用.

public static Socket ConnectToSocks5Proxy(string proxyAdress, ushort proxyPort, string destAddress, ushort destPort,
         string userName, string password)
        {
            IPAddress destIP = null;
            IPAddress proxyIP = null;
            byte[] request = new byte[257];
            byte[] response = new byte[257];
            byte[] tmpBuffer = new byte[40];

            proxyIP = IPAddress.Parse(proxyAdress);                     

            destIP = IPAddress.Parse(destAddress);

            IPEndPoint proxyEndPoint = new IPEndPoint(proxyIP, proxyPort);
          
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Connect(proxyEndPoint);

            String temp;

            temp = String.Format("CONNECT 127.0.0.1:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\r\n Proxy-Connection: Keep-Alive\r\n Proxy-Authorization: Basic YWRyZDExMTphZDgxOA== \r\n\r\n", destAddress, destPort);
            request = System.Text.Encoding.ASCII.GetBytes(temp);
            s.Send(request, temp.Length, SocketFlags.None);
            s.Receive(response); // Get variable length response...
            String tempstr = System.Text.Encoding.UTF8.GetString(response);
            if (tempstr.Substring(9, 3) == "200")
            {
                return s;
            }
            return null;
        }
jerry128的主页 jerry128 | 初学一级 | 园豆:31
提问于:2013-07-24 10:26
< >
分享
最佳答案
0

通过Http Header发送以下信息:

Proxy-Authorization: Basic <BASE64("USER:PASS")>

参考:Using HTTP proxy using Socket

收获园豆:20
dudu | 高人七级 |园豆:30994 | 2013-07-24 11:06

你好,我添加这个头,可还是不行,不知道是不是我写错了,请帮我看看

String.Format("CONNECT 127.0.0.1:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\r\n Proxy-Connection: Keep-Alive\r\n Proxy-Authorization: Basic <BASE64({0}:{1})>\r\n\r\n", userName, password)

这是我借用小提琴获取的头,可也是不行

"CONNECT 127.0.0.1:443 HTTP/1.1\r\nUser-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)\r\n Proxy-Connection: Keep-Alive\r\n Proxy-Authorization: Basic YWRyZDExMTphZDgxOA==
\r\n\r\n
"
jerry128 | 园豆:31 (初学一级) | 2013-07-24 12:11

@dudu: 这个方式可以设置代理的验证信息,如何指向代理服务器呢.?

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-07-24 13:18

@xmj112288: 建议先用80端口进行测试

dudu | 园豆:30994 (高人七级) | 2013-07-24 13:28

@发粪图墙: 这个可以问一下楼主

dudu | 园豆:30994 (高人七级) | 2013-07-24 13:29

@dudu: 和端口的关系不大吧,我可以连接上代理,就是取不到代理的验证,不知道怎么传账号和密码

jerry128 | 园豆:31 (初学一级) | 2013-07-24 16:20

@发粪图墙: connect后面就是指向的代理,只不过我本地用stunnel做了中转,就指向了本地

jerry128 | 园豆:31 (初学一级) | 2013-07-24 16:21

@xmj112288: 代理用的是什么验证方式?

dudu | 园豆:30994 (高人七级) | 2013-07-24 16:28

@dudu: 以前用httpwebrequest时能行,直接把代理ip账号密码付给WebProxy传出去,现在换了Socket,不知道怎么把账号密码传出去了.我本地用stunnel做了中转,在访问代理服务器,用的是http协议的代理.

jerry128 | 园豆:31 (初学一级) | 2013-07-24 16:39
其他回答(1)
-1

让我轻轻的告诉你,对于https或其它产生的connect请求,发送请求后,直接先返回一条应答的信息,之后才传输的请求数据。

相关代码,可以看我博客http代理相关文章里关于QQ上网实现的部分。

路过秋天 | 园豆:4787 (老鸟四级) | 2013-07-24 13:58

你好,我不是自己实现代理,而是用socket去访问代理服务器,和你做的不一样

支持(0) 反对(0) jerry128 | 园豆:31 (初学一级) | 2013-07-24 16:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册