简体   繁体   English

代理/袜子C#问题

[英]Proxy/Socks C# problem

How I can add proxy/socks4/socks5 to C# Socket. 如何将proxy / socks4 / socks5添加到C#Socket。

I need use it throw Socket. 我需要使用它抛出Socket。 I don't want use WebRequest and any classes. 我不想使用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;
}

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! 当你明确创建一个http web请求时,不清楚为什么你说你不想使用WebRequest (或者我想象, WebClient ),但我会假设你有理由!

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). 简而言之,在.Net中没有内置的支持SOCKS代理的方法,并且不支持与套接字一样低级别的http代理(由于无法保证请求是低的,所以它不会真正有意义。 http请求)。 There is http proxy support built into .Net at the higher HttpWebRequest / WebClient layer - but you've already discounted this. 在较高的HttpWebRequest / WebClient层上有.Net内置的http代理支持 - 但你已经打了折扣。

I think your options are: 我认为你的选择是:

  • Use the correct tool for the job ( HttpWebRequest or WebClient ) and get http proxy support for free. 使用正确的工具( HttpWebRequestWebClient )并免费获得http代理支持。
  • Use a third party implementation of SOCKS support, of which there appear to be a few if you do a Google search. 使用SOCKS支持的第三方实现,如果您进行Google搜索,则可能会有一些实施。 (for example this one). (例如一个)。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM