首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#需要帮助调试套接字5-连接调度

C#需要帮助调试套接字5-连接调度
EN

Stack Overflow用户
提问于 2010-04-01 20:29:50
回答 1查看 796关注 0票数 0

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

我发送用户/- auth并得到一个OK回复(0x00),但是一旦我告诉代理连接到哪个ip:port,它就会给我0x01 (一般错误)。

代码语言:javascript
复制
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罚款。我可以鉴定清楚。但我/代理不能“做”任何事?

是的,我知道代理可以工作。是的,目标ip是可用的,目标端口是open/responsive.

  • I get 0x01,不管我试图连接到什么.

任何帮助都是非常感谢的!

谢谢,

  • Chuck
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-04-01 20:33:17

你可能被恩典咬了。例如,BitConverter.GetBytes是否返回正确的字节?您是否跨过它并检查您的字节数组是否包含您期望它们的内容?

这看起来像小终端,而与网络相关的东西通常使用大端。BitConverter总是使用系统endianness,所以如果您在一个小的endian系统上运行(这似乎是在做的),您将不得不手动反转字节。BitConverter.IsLittleEndian会告诉您您的系统是否是小终端。

另外,把你的价值投给短线是个好主意,比如BigConverter.GetBytes((short)3333)。这样你就能得到你需要的两个字节。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2563457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档