开发者

Proxy/Socks C# problem

开发者 https://www.devze.com 2023-02-16 16:27 出处:网络
How I can add proxy/socks4/socks5 to C# Socket. I need use it throw Socket. I don\'t want use WebRequest and any classes.

How I can add proxy/socks4/socks5 to C# Socket.

I need use it throw Socket. I don't want use WebRequest and any classes.

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) Ge开发者_StackOverflow社区cko/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;
}

What will I add to this code?


Not quite sure why you say you don't want to use WebRequest (or I imagine, WebClient for that matter) when you are clearly creating an http web request, but I'll assume you have your reasons!

In short, there is no built in way of supporting SOCKS proxies in .Net, and there is not support for http proxies at the level as low as sockets (it wouldn't really make sense this low as there is no guarantee the requests are http requests). There is http proxy support built into .Net at the higher HttpWebRequest/WebClient layer - but you've already discounted this.

I think your options are:

  • Use the correct tool for the job (HttpWebRequest or WebClient) and get http proxy support for free.
  • Use a third party implementation of SOCKS support, of which there appear to be a few if you do a Google search. (for example this one).


instead of opening a socket to the actual location, try to open the socket to the proxy.

0

精彩评论

暂无评论...
验证码 换一张
取 消