代理/Socks C# 问题

Posted

技术标签:

【中文标题】代理/Socks C# 问题【英文标题】:Proxy/Socks C# problem 【发布时间】:2011-03-14 23:10:24 【问题描述】:

如何将 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;

我将在这段代码中添加什么?

【问题讨论】:

使用此代码连接代理时遇到什么错误? 此代码有效.. 代理和袜子不存在工作 【参考方案1】:

不太清楚为什么你说你不想使用WebRequest(或者我想,WebClient)当你清楚地创建一个http web请求时,但我假设你有你的理由!

简而言之,.Net 中没有支持 SOCKS 代理的内置方式,并且不支持低至套接字级别的 http 代理(因为无法保证,所以低级别没有任何意义请求是http请求)。 .Net 在更高的 HttpWebRequest/WebClient 层内置了 http 代理支持 - 但你已经打折了。

我认为您的选择是:

为工作使用正确的工具 (HttpWebRequestWebClient) 并得到 免费提供 http 代理支持。 使用第三方实现的 SOCKS 支持,如果您进行 Google 搜索,其中似乎有一些。 (例如this 一个)。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于代理/Socks C# 问题的主要内容,如果未能解决你的问题,请参考以下文章

C# HttpClient tor socks4/5 代理?

没有 SslStream 的 SSL,因为我想通过 SOCKS5 代理连接

怎么开socks5代理,!

怎样设置socks代理

怎样设置socks代理

如何正确认识socks5代理ip