【问题标题】:C# need help debugging socks5-connection attempC#需要帮助调试socks5-连接尝试
【发布时间】:2010-04-01 20:29:50
【问题描述】:

我编写了以下代码来(成功)连接到 socks5 代理。

我发送一个用户/密码验证并得到一个 OK 回复 (0x00),但是一旦我告诉代理连接到任何 ip:port,它就会给我 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。我可以很好地验证。但我/代理不能“做”任何事情?

  1. 是的,我知道代理可以工作。
  2. 是的,目标 ip 可用,是的,目标端口已打开/响应。
  3. 无论我尝试连接什么,我都会得到 0x01。

非常感谢任何帮助!

谢谢,

  • 查克

【问题讨论】:

    标签: c# sockets


    【解决方案1】:

    您可能会被字节顺序所困扰。例如,BitConverter.GetBytes 是否会返回正确的字节?您是否逐步检查并检查您的字节数组是否包含您期望的内容?

    这看起来像小端,与网络相关的东西通常使用大端。 BitConverter 始终使用系统字节序,因此如果您在小字节序系统上运行(您似乎正在这样做),则必须手动反转字节。 BitConverter.IsLittleEndian 会告诉你你的系统是否是小端。

    此外,最好将您的值转换为空值,例如BigConverter.GetBytes((short)3333)。这样你就可以得到你需要的两个字节。

    【讨论】:

    • 好点。不能说我不怀疑“endians”,因为我以前从未与他们合作过。如果我们说端口是 3333,那么它给出:5、13、0、0。我不确定这是对还是错?
    • 是的,但是最低有效字节在前,并且网络协议通常将最高有效字节在前(大端)。我不能说我检查了 SOCKS5 规格,但我怀疑它坚持使用大端的不成文标准。
    • 你完全正确!非常感谢你,马蒂!你刚刚为我节省了很多时间。复活节快乐:)
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2013-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多