Прокси / Socks C # проблема - PullRequest
       10

Прокси / Socks C # проблема

3 голосов
/ 15 марта 2011

Как я могу добавить proxy / socks4 / socks5 в C # 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 ]

3 голосов
/ 15 марта 2011

Не совсем понятно, почему вы говорите, что не хотите использовать WebRequest (или, я полагаю, WebClient), когда вы явно создаете веб-запрос http, но я предполагаю, что у вас есть свои причины!

Короче говоря, нет встроенного способа поддержки прокси-серверов SOCKS в .Net, и нет поддержки прокси-серверов http на уровне, столь же низком, как у сокетов (на самом деле это не имеет смысла, так какнет гарантии, что запросы являются http-запросами).В .Net встроена поддержка http-прокси на более высоком уровне HttpWebRequest / WebClient - но вы уже обесценили это.

Я думаю, ваши варианты:

  • Используйте правильный инструмент для задания (HttpWebRequest или WebClient) и получите бесплатную поддержку http-прокси.
  • Используйте стороннюю реализацию поддержки SOCKS, которой, по-видимому, немного, если вы это сделаетепоиск Google.(например это один).
2 голосов
/ 15 марта 2011

вместо открытия сокета для фактического местоположения, попробуйте открыть сокет для прокси.

...