我已经编写了以下代码(成功)连接到socks5代理。
我发送一个用户/ pw auth并获得OK回复(0x00),但是一旦我告诉代理连接到任何ip:端口,它就会给我0x01(一般错误)。
Socket socket5_proxy = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint proxyEndPoint = new IPEndPoint(IPAddress.Parse("111.111.111.111"), 1080); // proxy ip, port. fake for posting purposes.
socket5_proxy.Connect(proxyEndPoint);
byte[] init_socks_command = new byte[4];
init_socks_command[0] = 0x05;
init_socks_command[1] = 0x02;
init_socks_command[2] = 0x00;
init_socks_command[3] = 0x02;
socket5_proxy.Send(init_socks_command);
byte[] socket_response = new byte[2];
int bytes_recieved = socket5_proxy.Receive(socket_response, 2, SocketFlags.None);
if (socket_response[1] == 0x02)
{
byte[] temp_bytes;
string socks5_user = "foo";
string socks5_pass = "bar";
byte[] auth_socks_command = new byte[3 + socks5_user.Length + socks5_pass.Length];
auth_socks_command[0] = 0x05;
auth_socks_command[1] = Convert.ToByte(socks5_user.Length);
temp_bytes = Encoding.Default.GetBytes(socks5_user);
temp_bytes.CopyTo(auth_socks_command, 2);
auth_socks_command[2 + socks5_user.Length] = Convert.ToByte(socks5_pass.Length);
temp_bytes = Encoding.Default.GetBytes(socks5_pass);
temp_bytes.CopyTo(auth_socks_command, 3 + socks5_user.Length);
socket5_proxy.Send(auth_socks_command);
socket5_proxy.Receive(socket_response, 2, SocketFlags.None);
if (socket_response[1] != 0x00)
return;
byte[] connect_socks_command = new byte[10];
connect_socks_command[0] = 0x05;
connect_socks_command[1] = 0x01; // streaming
connect_socks_command[2] = 0x00;
connect_socks_command[3] = 0x01; // ipv4
temp_bytes = IPAddress.Parse("222.222.222.222").GetAddressBytes(); // target connection. fake ip, obviously
temp_bytes.CopyTo(connect_socks_command, 4);
byte[] portBytes = BitConverter.GetBytes(3333);
connect_socks_command[8] = portBytes[0];
connect_socks_command[9] = portBytes[1];
socket5_proxy.Send(connect_socks_command);
socket5_proxy.Receive(socket_response);
if (socket_response[1] != 0x00)
MessageBox.Show("Damn it"); // I always end here, 0x01
我已将此作为参考:http://en.wikipedia.org/wiki/SOCKS#SOCKS_5
我在这里完全误解了什么吗?我怎么看,我可以连接到socks5罚款。我可以认证很好。但我/代理人不能“做”什么?
非常感谢任何帮助!
谢谢,
答案 0 :(得分:0)
你可能会因为字节序而被咬。例如,BitConverter.GetBytes会返回正确的字节吗?您是否单步执行它并检查您的字节数组是否包含您期望它们的内容?
看起来像小端,与网络相关的东西通常使用大端。 BitConverter总是使用系统字节序,因此如果你在一个小端系统(你似乎正在做)上运行,你将不得不手动反转字节。 BitConverter.IsLittleEndian
会告诉您系统是否为小端。
此外,将您的价值投入到短期是个好主意,例如BigConverter.GetBytes((short)3333)
。这样你就可以得到你需要的两个字节。