通过socks代理获取网页的C#源码有错误,哪位网位能帮忙找出错误修改成可用的,酬谢100元(帮忙看下这源码哪错了。谢谢) 本帖最后由 yzmsb 于 2009-10-15 21:18:51 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 if (iRecCount < 2) { sProxyServer.Close(); throw new Exception("不能获得代理服务器正确响应。 "); //总是报这行错误,上面的代理ip能登录QQ,说明代理应该是可用的 }上面现在发现的错误是 IrecCount总是 0 好像就是网上的代码么,你对一下看看哪里写错了http://hi.baidu.com/laozhanzhang/blog/item/3b16c51f18112a61f624e40f.htmlhttp://topic.csdn.net/t/20060831/17/4989977.html 经过对比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("代理服务其返回的响应错误。 "); } 我在csdn里发过多次话费求助帖,因为没有好的答案就只兑现过一次,我很汗哪位朋友能参照网上的源码把我楼顶的修改完整,一定兑现承诺 private void SSend(string str,Socket sRH) { byte[] b= Encoding.Default.GetBytes(str); sRH.Send(b); } 后少了}最后多}在开发环境里调试就是 你好。是已经分开的呀 private void Form1_Load(object sender, EventArgs e) { } } /// <summary> /// 使用Socks5代理服务器连接网络 /// </summary> 上面有两个}呢,问题应该不在这里。,我刚用59.108.29.130这个代理ip发现不会报错,写的http请求也发送了,可没有获得返回页面。 可能socks的应答不一样,楼顶的代码没有考虑周全,其他代理ip我用来登录QQ都正常的,可我用上面的程序却“不能获得代理服务器正确响应”,这很奇怪 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#江苏省无锡市 电信ADSL58.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#印度尼西亚 Unknown61.10.79.75:1080@SOCKS4#香港 有线电视61.49.7.135:1080@SOCKS4#北京市 联通ADSL61.110.113.172:1080@SOCKS4#韩国 Unknown61.177.248.202:1080@SOCKS4#江苏省盐城市 电信ADSL61.244.157.239:1080@SOCKS4#香港 特别行政区62.150.4.25:1080@SOCKS4#科威特 Unknown64.16.165.12:80@SOCKS4#美国 加洲68.9.200.166:18305@SOCKS4#美国 Cox通信用户69.121.1.77:8068@SOCKS4#美国 Unknown75.24.1.196:6691@SOCKS4#美国 Unknown77.47.187.108:1080@SOCKS4#乌克兰 Unknown82.145.240.37:1080@SOCKS4#土耳其 Unknown82.230.205.134:1025@SOCKS4#法国 巴黎83.13.143.74:1080@SOCKS4#美国 Unknown87.226.120.67:1112@SOCKS4#拉脱维亚 Unknown88.191.97.2:1080@SOCKS4#法国 Unknown89.115.2.128:1080@SOCKS4#美国 Unknown91.135.244.13:1080@SOCKS4#美国 Unknown94.113.65.141:1080@SOCKS4#美国 Unknown98.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#北美地区 Unknown189.51.34.171:1080@SOCKS4#巴西 Unknown193.165.154.77:1080@SOCKS4#捷克 Unknown196.219.125.66:1080@SOCKS4#南非 Unknown201.144.30.227:1080@SOCKS4#巴西 Vivax公司201.201.174.126:1080@SOCKS4#巴西 Vivax公司202.57.10.25:1080@SOCKS4#印度尼西亚 Unknown202.57.10.38:1080@SOCKS4#印度尼西亚 Unknown203.172.181.166:1080@SOCKS4#泰国 Unknown206.248.239.190:81@SOCKS4#美国/加拿大 Unknown207.182.153.22:1080@SOCKS4#美国 俄亥俄州哥伦布市eNet公司209.254.15.155:80@SOCKS4#美国/加拿大 Unknown210.83.80.138:1080@SOCKS4#浙江省宁波市 联通211.90.248.97:1080@SOCKS4#浙江省宁波市 联通211.114.96.2:1080@SOCKS4#韩国 Unknown212.6.39.180:1080@SOCKS4#德国 Unknown212.175.4.1:1080@SOCKS4#土耳其 Unknown212.175.122.1:1080@SOCKS4#土耳其 Unknown217.75.82.9:1080@SOCKS4#欧洲 Unknown218.5.18.252:1080@SOCKS4#福建省福州市 绿岩网吧(首山路184号)218.7.191.182:1080@SOCKS4#黑龙江省伊春市 新青区联通218.25.99.135:1080@SOCKS4#辽宁省沈阳市 联通ADSL218.28.192.10:1080@SOCKS4#河南省郑州市 联通218.56.21.226:1080@SOCKS4#山东省菏泽市 定陶县网乐网吧219.140.117.137:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL219.140.118.33:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL219.140.118.202:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL219.140.118.234:1080@SOCKS4#湖北省武汉市 (武昌区)电信ADSL219.146.172.98:1080@SOCKS4#山东省菏泽市 定陶金茂街网乐网吧219.150.227.101:1080@SOCKS4#河南省长葛市 电信219.157.200.19:1080@SOCKS4#河南省郑州市 联通ADSL219.159.199.34:1080@SOCKS4#广西北海市 玫瑰缘网吧220.173.107.19:1080@SOCKS4#广西柳州市 电信220.179.61.62:1080@SOCKS4#安徽省宿州市 电信ADSL220.189.227.2:1080@SOCKS4#浙江省绍兴市 (嵊州)电信220.225.235.250:1080@SOCKS4#新加坡 Unknown221.2.86.54:1080@SOCKS4#山东省临沂市 (平邑县)联通221.7.229.86:1080@SOCKS4#广西北海市 联通222.66.47.115:8088@SOCKS4#上海市闵行区 电信ADSL222.72.132.166:1080@SOCKS4#上海市奉贤区 电信ADSL222.74.200.2:1080@SOCKS4#内蒙古呼和浩特市 电信222.170.106.202:1080@SOCKS4#黑龙江省佳木斯市 电信ADSL222.188.10.1:1080@SOCKS4#江苏省盐城市 电信ADSL 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 }} string proxyHost = "69.121.1.77";// "10.4.8.1";// int proxyProt = 8068;你写的东西也没有错。用这个地址代替一下。比较慢。昨天试了一下可以。网上代理服务软件很多。你可以下载一个试试。比较方便。 你好,谢谢你的回帖,你帖的这种是完全匿名的,而且不知道怎么回事,你的这个代码比楼顶的那个要卡好多,可否帮忙完善一下代码呀。通过socket进行http访问。 为了感谢大家的热情帮忙,如果有完整的可用的通过socks5代理访问http的代码,酬谢100话费卡密,如果没有完整的答案,两天后我像分技术分一样去淘宝买100元小面额的话费卡密站短PM给各位回帖的 socks5应该是全能代理呀,即然QQ可用,我想可能是上面的代码某方面判断比较局限 namespace 代理测试器这个改成英文试试,很多问题都是由于代码不能识别中文造成的。 你好。网上找的免费的.是很奇怪。QQ都能上http却用不了。我想应该是代理ip质量的问题。这方法行不通只好放弃了。 话费卡密我前几天PM给楼上每位之前回帖的每人1张10元卡密了。我把技术分都送给你呀。谢谢! 代码有错。阅读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]。你只要换一个不需要身份验证的代理服务器这段代码就能工作了。 菜鸟求助! C#如何实现打印网页 登录请求问题 如何在tabPage添加水平滚动条? C#有关调节声音的问题? 精品JS脚本下载:XMLTree2.1,不下可要后悔的 c#多表更新执行没反应?? 怎样点击button调用js文件功能 做c#开发的朋友留个QQ吧,大家多交流 在ASP.Net程序里嵌入Pull模式的水晶报表出错 窗体件传递数据问题 窗体问题
{
sProxyServer.Close();
throw new Exception("不能获得代理服务器正确响应。 "); //总是报这行错误,上面的代理ip能登录QQ,说明代理应该是可用的
}上面现在发现的错误是 IrecCount总是 0
http://hi.baidu.com/laozhanzhang/blog/item/3b16c51f18112a61f624e40f.html
http://topic.csdn.net/t/20060831/17/4989977.html
} //这里不应该出现}的这里修改一下。。不提示错误了 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("代理服务其返回的响应错误。 ");
}
{
byte[] b= Encoding.Default.GetBytes(str);
sRH.Send(b);
} 后少了}
最后多}
在开发环境里调试就是
你好。是已经分开的呀
private void Form1_Load(object sender, EventArgs e)
{ }
}
/// <summary>
/// 使用Socks5代理服务器连接网络
/// </summary> 上面有两个}呢,问题应该不在这里。,我刚用59.108.29.130这个代理ip发现不会报错,写的http请求也发送了,可没有获得返回页面。 可能socks的应答不一样,楼顶的代码没有考虑周全,其他代理ip我用来登录QQ都正常的,可我用上面的程序却“不能获得代理服务器正确响应”,这很奇怪
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
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
}
}
int proxyProt = 8068;你写的东西也没有错。
用这个地址代替一下。比较慢。昨天试了一下可以。
网上代理服务软件很多。你可以下载一个试试。比较方便。
你好。网上找的免费的.是很奇怪。QQ都能上http却用不了。我想应该是代理ip质量的问题。这方法行不通只好放弃了。 话费卡密我前几天PM给楼上每位之前回帖的每人1张10元卡密了。我把技术分都送给你呀。谢谢!
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]。你只要换一个不需要身份验证的代理服务器这段代码就能工作了。