本帖最后由 yzmsb 于 2009-10-15 21:18:51 编辑

解决方案 »

  1.   

    if (iRecCount < 2)
            {
                sProxyServer.Close();
                throw new Exception("不能获得代理服务器正确响应。 ");  //总是报这行错误,上面的代理ip能登录QQ,说明代理应该是可用的
            }上面现在发现的错误是 IrecCount总是 0
      

  2.   

    好像就是网上的代码么,你对一下看看哪里写错了
    http://hi.baidu.com/laozhanzhang/blog/item/3b16c51f18112a61f624e40f.html
    http://topic.csdn.net/t/20060831/17/4989977.html
      

  3.   

    经过对比vb的发现原来
    }  //这里不应该出现}的这里修改一下。。不提示错误了        if (iRecCount < 2)
            {
                sProxyServer.Close();
                throw new Exception("不能获得代理服务器正确响应。 ");  //总是报这行错误,上面的代理ip能登录QQ,说明代理应该是可用的
            }        if (bySock5Receive[0] != 5 || (bySock5Receive[1] != 0 && bySock5Receive[1] != 2))
            {
                sProxyServer.Close();
                throw new Exception("代理服务其返回的响应错误。 ");
            }
      

  4.   

    我在csdn里发过多次话费求助帖,因为没有好的答案就只兑现过一次,我很汗哪位朋友能参照网上的源码把我楼顶的修改完整,一定兑现承诺
      

  5.   

    private   void   SSend(string   str,Socket   sRH) 

    byte[]   b=   Encoding.Default.GetBytes(str); 
    sRH.Send(b); 
    } 后少了}
    最后多}
    在开发环境里调试就是
      

  6.   


    你好。是已经分开的呀
            private void Form1_Load(object sender, EventArgs e)
            {        }
      }
            ///   <summary> 
            ///   使用Socks5代理服务器连接网络 
            ///   </summary> 上面有两个}呢,问题应该不在这里。,我刚用59.108.29.130这个代理ip发现不会报错,写的http请求也发送了,可没有获得返回页面。 可能socks的应答不一样,楼顶的代码没有考虑周全,其他代理ip我用来登录QQ都正常的,可我用上面的程序却“不能获得代理服务器正确响应”,这很奇怪
      

  7.   

    24.63.41.220:4799@SOCKS4#美国 新泽西州月桂山镇Comcast通信公司
    58.49.138.231:1080@SOCKS4#湖北省武汉市 电信
    58.51.90.249:1080@SOCKS4#湖北省襄樊市 电信
    58.214.5.162:1080@SOCKS4#江苏省无锡市 电信ADSL
    58.216.151.94:1080@SOCKS4#江苏省常州市 电信
    58.241.40.228:1080@SOCKS4#江苏省无锡市 联通
    59.108.29.130:1080@SOCKS4#北京市 方正宽带  //这个连上了,也发送了数据,但却没有返回页面
    60.191.96.93:1080@SOCKS4#浙江省杭州市 电信
    61.8.73.234:1080@SOCKS4#印度尼西亚 Unknown
    61.10.79.75:1080@SOCKS4#香港 有线电视
    61.49.7.135:1080@SOCKS4#北京市 联通ADSL
    61.110.113.172:1080@SOCKS4#韩国 Unknown
    61.177.248.202:1080@SOCKS4#江苏省盐城市 电信ADSL
    61.244.157.239:1080@SOCKS4#香港 特别行政区
    62.150.4.25:1080@SOCKS4#科威特 Unknown
    64.16.165.12:80@SOCKS4#美国 加洲
    68.9.200.166:18305@SOCKS4#美国 Cox通信用户
    69.121.1.77:8068@SOCKS4#美国 Unknown
    75.24.1.196:6691@SOCKS4#美国 Unknown
    77.47.187.108:1080@SOCKS4#乌克兰 Unknown
    82.145.240.37:1080@SOCKS4#土耳其 Unknown
    82.230.205.134:1025@SOCKS4#法国 巴黎
    83.13.143.74:1080@SOCKS4#美国 Unknown
    87.226.120.67:1112@SOCKS4#拉脱维亚 Unknown
    88.191.97.2:1080@SOCKS4#法国 Unknown
    89.115.2.128:1080@SOCKS4#美国 Unknown
    91.135.244.13:1080@SOCKS4#美国 Unknown
    94.113.65.141:1080@SOCKS4#美国 Unknown
    98.198.87.228:1025@SOCKS4#美国 新泽西州月桂山镇Comcast通信公司
    112.91.145.78:1080@SOCKS4#广东省河源市 联通
    116.10.198.42:1080@SOCKS4#广西南宁市 电信
    119.161.161.189:1080@SOCKS4#北京市 蓝波宽带
    121.8.124.42:1080@SOCKS4#广东省广州市 电信
    121.22.20.202:1080@SOCKS4#河北省秦皇岛市 联通
    121.22.42.22:1080@SOCKS4#河北省秦皇岛市 联通
    122.227.147.46:1080@SOCKS4#浙江省宁波市 电信
    124.207.99.61:1080@SOCKS4#北京市 电信通
    124.237.86.62:1080@SOCKS4#河北省秦皇岛市 电信
    125.134.217.229:11033@SOCKS4#韩国 电信公司
    173.2.60.51:7571@SOCKS4#北美地区 Unknown
    189.51.34.171:1080@SOCKS4#巴西 Unknown
    193.165.154.77:1080@SOCKS4#捷克 Unknown
    196.219.125.66:1080@SOCKS4#南非 Unknown
    201.144.30.227:1080@SOCKS4#巴西 Vivax公司
    201.201.174.126:1080@SOCKS4#巴西 Vivax公司
    202.57.10.25:1080@SOCKS4#印度尼西亚 Unknown
    202.57.10.38:1080@SOCKS4#印度尼西亚 Unknown
    203.172.181.166:1080@SOCKS4#泰国 Unknown
    206.248.239.190:81@SOCKS4#美国/加拿大 Unknown
    207.182.153.22:1080@SOCKS4#美国 俄亥俄州哥伦布市eNet公司
    209.254.15.155:80@SOCKS4#美国/加拿大 Unknown
    210.83.80.138:1080@SOCKS4#浙江省宁波市 联通
    211.90.248.97:1080@SOCKS4#浙江省宁波市 联通
    211.114.96.2:1080@SOCKS4#韩国 Unknown
    212.6.39.180:1080@SOCKS4#德国 Unknown
    212.175.4.1:1080@SOCKS4#土耳其 Unknown
    212.175.122.1:1080@SOCKS4#土耳其 Unknown
    217.75.82.9:1080@SOCKS4#欧洲 Unknown
    218.5.18.252:1080@SOCKS4#福建省福州市 绿岩网吧(首山路184号)
    218.7.191.182:1080@SOCKS4#黑龙江省伊春市 新青区联通
    218.25.99.135:1080@SOCKS4#辽宁省沈阳市 联通ADSL
    218.28.192.10:1080@SOCKS4#河南省郑州市 联通
    218.56.21.226:1080@SOCKS4#山东省菏泽市 定陶县网乐网吧
    219.140.117.137:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL
    219.140.118.33:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL
    219.140.118.202:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL
    219.140.118.234:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL
    219.146.172.98:1080@SOCKS4#山东省菏泽市 定陶金茂街网乐网吧
    219.150.227.101:1080@SOCKS4#河南省长葛市 电信
    219.157.200.19:1080@SOCKS4#河南省郑州市 联通ADSL
    219.159.199.34:1080@SOCKS4#广西北海市 玫瑰缘网吧
    220.173.107.19:1080@SOCKS4#广西柳州市 电信
    220.179.61.62:1080@SOCKS4#安徽省宿州市 电信ADSL
    220.189.227.2:1080@SOCKS4#浙江省绍兴市 (嵊州)电信
    220.225.235.250:1080@SOCKS4#新加坡 Unknown
    221.2.86.54:1080@SOCKS4#山东省临沂市 (平邑县)联通
    221.7.229.86:1080@SOCKS4#广西北海市 联通
    222.66.47.115:8088@SOCKS4#上海市闵行区 电信ADSL
    222.72.132.166:1080@SOCKS4#上海市奉贤区 电信ADSL
    222.74.200.2:1080@SOCKS4#内蒙古呼和浩特市 电信
    222.170.106.202:1080@SOCKS4#黑龙江省佳木斯市 电信ADSL
    222.188.10.1:1080@SOCKS4#江苏省盐城市 电信ADSL
      

  8.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Net;namespace WindowsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }        private void Form2_Load(object sender, EventArgs e)
            {
                string proxyHost = "211.100.26.111";//代理的ip和端口 
                int proxyProt = 80;
                Socket sRemoteHost = GetSocket(proxyHost, proxyProt);
                ConnectProxyServer("www.86516.com", 80, sRemoteHost); 
            }        #region
            private bool ConnectProxyServer(string strRemoteHost, int iRemotePort, Socket sProxyServer)
            {
                //构造Socks5代理服务器第一连接头(无用户名密码) 
                byte[] bySock5Send = new Byte[10];
                bySock5Send[0] = 5;
                bySock5Send[1] = 1;
                bySock5Send[2] = 0;            //发送Socks5代理第一次连接信息 
                sProxyServer.Send(bySock5Send, 3, SocketFlags.None);            byte[] bySock5Receive = new byte[10];
                int iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);            if (iRecCount < 2)
                {
                    sProxyServer.Close();
                    throw new Exception("不能获得代理服务器正确响应。");
                }            if (bySock5Receive[0] != 5 || (bySock5Receive[1] != 0 && bySock5Receive[1] != 2))
                {
                    sProxyServer.Close();
                    throw new Exception("代理服务其返回的响应错误。");
                }            if (bySock5Receive[1] == 0)
                {
                    bySock5Send[0] = 5;
                    bySock5Send[1] = 1;
                    bySock5Send[2] = 0;
                    bySock5Send[3] = 1;                IPAddress ipAdd = Dns.Resolve(strRemoteHost).AddressList[0];
                    string strIp = ipAdd.ToString();
                    string[] strAryTemp = strIp.Split(new char[] { '.' });
                    bySock5Send[4] = Convert.ToByte(strAryTemp[0]);
                    bySock5Send[5] = Convert.ToByte(strAryTemp[1]);
                    bySock5Send[6] = Convert.ToByte(strAryTemp[2]);
                    bySock5Send[7] = Convert.ToByte(strAryTemp[3]);                bySock5Send[8] = (byte)(iRemotePort / 256);
                    bySock5Send[9] = (byte)(iRemotePort % 256);                sProxyServer.Send(bySock5Send, bySock5Send.Length, SocketFlags.None);
                    iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);                if (bySock5Receive[0] != 5 || bySock5Receive[1] != 0)
                    {
                        sProxyServer.Close();
                        throw new Exception("第二次连接Socks5代理返回数据出错。");
                    }
                    return true;
                }
                else
                {
                    if (bySock5Receive[1] == 2)
                        throw new Exception("代理服务器需要进行身份确认。");
                    else return false;
                }
            }        private Socket GetSocket(string strIpAdd, int iPort)
            {
                IPAddress hostadd = Dns.Resolve(strIpAdd).AddressList[0];
                IPEndPoint EPhost = new IPEndPoint(hostadd, iPort);
                Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                s.Connect(EPhost);
                return s;
            } 
            #endregion 
        }
    }
      

  9.   

            string proxyHost = "69.121.1.77";// "10.4.8.1";//
                int proxyProt = 8068;你写的东西也没有错。
    用这个地址代替一下。比较慢。昨天试了一下可以。
    网上代理服务软件很多。你可以下载一个试试。比较方便。
      

  10.   

    你好,谢谢你的回帖,你帖的这种是完全匿名的,而且不知道怎么回事,你的这个代码比楼顶的那个要卡好多,可否帮忙完善一下代码呀。通过socket进行http访问。
      

  11.   

    为了感谢大家的热情帮忙,如果有完整的可用的通过socks5代理访问http的代码,酬谢100话费卡密,如果没有完整的答案,两天后我像分技术分一样去淘宝买100元小面额的话费卡密站短PM给各位回帖的
      

  12.   

    socks5应该是全能代理呀,即然QQ可用,我想可能是上面的代码某方面判断比较局限
      

  13.   

    namespace 代理测试器这个改成英文试试,很多问题都是由于代码不能识别中文造成的。
      

  14.   


    你好。网上找的免费的.是很奇怪。QQ都能上http却用不了。我想应该是代理ip质量的问题。这方法行不通只好放弃了。 话费卡密我前几天PM给楼上每位之前回帖的每人1张10元卡密了。我把技术分都送给你呀。谢谢!
      

  15.   

    代码有错。阅读http://tools.ietf.org/html/rfc1928后发现,当响应的第二个字节为2时,也就是这句代码:
                else if (bySock5Receive[1] == 2)
    ,表示这个代理服务器需要身份验证,所以这段代码块就是处理身份验证的,在这段代码段后面的这几句:
                sProxyServer.Send(bySock5Send, dl, SocketFlags.None);            bySock5Receive = new byte[100];
                iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
    就是到服务器进行验证,这里的关键是,这次会覆盖第一次交互过的数据,即iRecCount和bySock5Receive[0]和bySock5Receive[1],后面的这句判断语句
    bySock5Receive[1] != 0又刚好是表示用户名和密码不正确,所以我怀疑这段代码的合理性。所以应该是:        else if (bySock5Receive[1] == 2)
            {
                //构造Socks5代理服务器第一连接头(无用户名密码) 
                byte[] bUser = Encoding.Default.GetBytes(Username);
                byte[] bPass = Encoding.Default.GetBytes(Password);            int dl = 3 + bUser.Length + bPass.Length;            bySock5Send = new Byte[dl];
                bySock5Send[0] = 5;
                bySock5Send[1] = (byte)bUser.Length;
                Array.Copy(bUser, 0, bySock5Send, 2, bUser.Length);
                bySock5Send[2 + bUser.Length] = (byte)bPass.Length;
                Array.Copy(bPass, 0, bySock5Send, 3 + bUser.Length, bPass.Length);            //发送Socks5代理第一次连接信息   
                sProxyServer.Send(bySock5Send, dl, SocketFlags.None);            bySock5Receive = new byte[100];
                iRecCount = sProxyServer.Receive(bySock5Receive, bySock5Receive.Length, SocketFlags.None);
                    if (iRecCount < 2)
                    {
                        sProxyServer.Close();
                        throw new Exception("不能获得代理服务器正确响应。 ");  //总是报这行错误,上面的代理ip能登录QQ,说明代理应该是可用的
                    }                if (bySock5Receive[0] != 5 || (bySock5Receive[1] != 0 && bySock5Receive[1] != 2))
                    {
                        sProxyServer.Close();
                        throw new Exception("代理服务其返回的响应错误。 ");
                    }
            }
    我认为最好要把第一次和第二次的交互数据都做验证,即两次验证iRecCount和bySock5Receive[0]和bySock5Receive[1]。你只要换一个不需要身份验证的代理服务器这段代码就能工作了。