none
使用socks代理遇到的新问题 RRS feed

  • 问题

  • 我现在在尝试以下的方法实现通过sock4/5代理来获取网站源代码(类似于浏览器):http://www.cnblogs.com/yellowyu/archive/2008/11/05/1327089.html

    但是我在实现过程中,遇到以下问题:

    1、在第一次使用Receive后获取的数据:

    VER

    METHOD

    我的返回值两个都是0

    2、在第二次Receive的时候,返回

    VER

    REP

    RSV

    ATYP

    BND.ADDR

    BND.PORT

    我竟然也是全部返回为0;

    3、就算前面两步都成功了,接下来我也不知道该怎么写写代码了,因为i额在网上的教程对于“应答处理 ”都是用的文字描述,我的能力太浅还不能理解

    各位大神,先膜拜了,先帮我解决一下前两个问题,然后再帮我解决一下第三个问题,先谢谢了

    贴上我的代码:

    Socket^ ConnectSocket(String^ server, int port)
    {
    Socket^ s = nullptr;
    IPHostEntry^ hostEntry = nullptr;

    // Get host related information.
    hostEntry = Dns::Resolve(server);

    // Loop through the AddressList to obtain the supported AddressFamily. This is to avoid
    // an exception that occurs when the host IP Address is not compatible with the address family
    // (typical in the IPv6 case).
    System::Collections::IEnumerator^ myEnum = hostEntry->AddressList->GetEnumerator();
    while (myEnum->MoveNext())
    {
    IPAddress^ address = safe_cast<IPAddress^>(myEnum->Current);
    IPEndPoint^ endPoint = gcnew IPEndPoint(address, port);
    Socket^ tmpS = gcnew Socket(endPoint->AddressFamily, SocketType::Stream, ProtocolType::Tcp);
    tmpS->Connect(endPoint);


    if (tmpS->Connected)
    {
    MessageBox::Show("代理服务器连接成功!");

    s = tmpS;
    break;
    }
    else
    {
    MessageBox::Show("代理服务器连接失败!");
    continue;
    }
    }

    return s;
    }

      

    System::Void button3_Click(System::Object^  sender, System::EventArgs^  e) {

    Socket^ s = ConnectSocket("58.59.68.91", 1080);    //我用浏览器测试的当时可用的代理服务器,之后是否可用不清楚,可修改

    int nIndex = 0;
    array<Byte>^ request = gcnew array<Byte>(100);

    request[nIndex++] = 0x04; // Version 4.

    request[nIndex++] = 0x01; // 1 Authentication methods are in packet...

    request[nIndex++] = 0x00; // NO AUTHENTICATION REQUIRED

    s->Send(request, nIndex, SocketFlags::None);

    array<Byte>^ response = gcnew array<Byte>(10);
    int nGot = s->Receive(response, 2, SocketFlags::None);


    MessageBox::Show("返回值1:" + response[0]+"\r\n"+response[1]);    //全部返回为0

    if (response[1] == 0xFF)

    {    // No authentication method was accepted close the socket.

    s->Close();

    return;
    }

    if (response[1] == 0x00)
    {
    String^ destAddress = "www.so.com";
    int destPort = 80;

    nIndex = 0;

    request[nIndex++] = 0x04;
    request[nIndex++] = 0x01;
    request[nIndex++] = 0x00;
    request[nIndex++] = 0x03;
    request[nIndex++] = Convert::ToByte(destAddress->Length); // length of address.

    array<Byte>^ rawBytes = Encoding::Default->GetBytes(destAddress);

    rawBytes->CopyTo(request, nIndex);

    nIndex += (unsigned short)rawBytes->Length;

    // using big-edian byte order

    array<Byte>^ portBytes = BitConverter::GetBytes(destPort);

    for (int i = portBytes->Length - 1; i >= 0; i--) {
    request[nIndex++] = portBytes[i];
    }

    // send connect request.

    s->Send(request, nIndex, SocketFlags::None);

    s->Receive(response,6, SocketFlags::None);
    MessageBox::Show("返回值2:" + response[0] + "\r\n" + response[1] + "\r\n"
    + response[2] + "\r\n" + response[3] + "\r\n" + response[4] + "\r\n"
    + response[5]);    //全部返回为0
    ……接下来我就不知道怎么写了,请大神赐教

    }
    }


    2016年11月19日 14:44

全部回复

  • Hi 求知与释疑,

    感谢在MSDN论坛发帖。

    >>1、在第一次使用Receive后获取的数据:

    我的返回值两个都是0

    2、在第二次Receive的时候,返回
     
    我竟然也是全部返回为0;

    3、就算前面两步都成功了,接下来我也不知道该怎么写写代码了,因为i额在网上的教程对于“应答处理 ”都是用的文字描述,我的能力太浅还不能理解

    对于你的前两个问题,我建议你使用Network Tracing来debug问题原因。

    这里有两篇文档,关于如何配置和使用。你可以参考一下。

    https://msdn.microsoft.com/en-us/library/ty48b824(v=vs.110).aspx

    https://blogs.msdn.microsoft.com/benjaminperkins/2014/05/05/using-network-tracing-to-debug-system-net-based-issues/

    对于第三个问题,在他的代码中已经有所体现了。其实应答处理就是指对各种connect,bind, receive等操作的处理。例如

    if (response[1] == 0xFF)
    
    {    // No authentication method was accepted close the socket.
    
    s.Close();
    
    throw new ConnectionException("None of the authentication method was accepted by proxy server.");
    
    }
    

    在连接失败后,会调用s.Close关闭socket并且抛出异常。这些就是应答处理。

    这里有篇示例关于Socket Class的使用,你也可以参考一下。

    https://msdn.microsoft.com/en-us/library/system.net.sockets.socket(v=vs.110).aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-2

    希望对你有所帮助。

    PS:我会建立一个工程对你的代码进行测试,后面会放出测试结果。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月21日 9:17
  • 我还想知道的是如果服务器连接等一切正常,我究竟该如何接受网站的源代码

    2016年11月22日 6:14
  • >>我还想知道的是如果服务器连接等一切正常,我究竟该如何接受网站的源代码

    你可以使用以下几种方式:

    1。使用Server.CreateObject(“Microsoft.XMLHTTP”)创建XMLHTTP 的一个实例。 然后可以使用Open和Send方法来获取网页的源代码。

    2. 使用Browser Helper Objects来查看。

    3. 使用WinINet来查看。

    下面是一些示例,针对每一种方式,你可以参考使用。

    http://www.codeproject.com/Articles/2425/Get-The-HTML-Source-of-Any-Web-Page

    https://msdn.microsoft.com/en-us/library/bb250436.aspx

    http://www.codeguru.com/cpp/i-n/internet/generalinternet/article.php/c3411/Get-web-page-using-WinInet-class-wrapper.htm

    希望可以帮助到你。

    Best Regards,

    Sera Yu


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2016年11月25日 3:30