代理/袜子C#问题

时间:2011-03-14 23:10:25

标签: c# .net proxy socks

如何将proxy / socks4 / socks5添加到C#Socket。

我需要使用它抛出Socket。 我不想使用WebRequest和任何类。

private static Socket ConnectSocket(string server, int port)
{
    Socket s = null;
    IPHostEntry hostEntry = null;

    // Get host related information.
    hostEntry = Dns.GetHostEntry(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).
    foreach (IPAddress address in hostEntry.AddressList)
    {
        IPEndPoint ipe = new IPEndPoint(address, port);
        Socket tempSocket =
            new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);

        tempSocket.Connect(ipe);

        if (tempSocket.Connected)
        {
            s = tempSocket;
            break;
        }
        else
        {
            continue;
        }
    }
    return s;
}

public static string SocketQuery(string Url, int Port, string Method = "GET", string Cookie = "", string DataFields = "")
{
    string host = ExtractDomainAndPathFromURL(Url);

    string request = Method.ToUpper() + " " + ExtractDomainAndPathFromURL(Url, 2) + " HTTP/1.1\r\n" +
        "Host: " + host + "\r\n" +
        ((Cookie != String.Empty) ? "Cookie: " + Cookie + "\r\n" : "") +
        ((Method.ToUpper() == "POST") ? "Content-Length:" + DataFields.Length + "\r\n" : "") +
        "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13\r\n" +
        "Connection: Close\r\n" +
        "Content-Type: application/x-www-form-urlencoded\r\n" +
        "\r\n" +
        ((Method.ToUpper() == "POST") ? DataFields : "");

    Byte[] bytesSent = Encoding.ASCII.GetBytes(request);
    Byte[] bytesReceived = new Byte[256];

    Socket s = ConnectSocket(host, Port);

    if (s == null)
        return ("Connection failed");

    s.Send(bytesSent, bytesSent.Length, 0);

    int bytes = 0;
    string page = String.Empty;

    do
    {
        bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
        page = page + Encoding.GetEncoding("UTF-8").GetString(bytesReceived, 0, bytes);
    }
    while (bytes > 0);

    return page;
}

我将在此代码中添加什么内容?

2 个答案:

答案 0 :(得分:3)

当您明确创建http网络请求时,不清楚为什么您说您不想使用WebRequest(或者我想象,WebClient),但我会假设你有理由!

简而言之,在.Net中没有内置的支持SOCKS代理的方法,并且不支持与套接字一样低的http代理(由于无法保证,这种情况不会很有意义。请求是http请求)。在较高的HttpWebRequest / WebClient图层中,.Net内置了http代理支持 - 但您已经打了折扣。

我认为你的选择是:

  • 使用正确的工具完成工作 (HttpWebRequestWebClient)并获取 http代理支持免费。
  • 使用SOCKS支持的第三方实施,如果您进行Google搜索,似乎会有一些支持。 (例如this一个)。

答案 1 :(得分:2)

而不是打开实际位置的套接字,尝试打开代理的套接字。