代理/Socks C# 问题

发布于 2024-10-21 19:50:42 字数 2290 浏览 1 评论 0原文

如何将 proxy/socks4/socks5 添加到 C# 套接字。

我需要使用它抛出套接字。 我不想使用 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;
}

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

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) 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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

情话墙 2024-10-28 19:50:42

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

简而言之,.Net 中没有支持 SOCKS 代理的内置方法,并且不支持低至套接字级别的 http 代理(这么低的级别实际上没有意义,因为不能保证请求是正确的) http 请求)。 .Net 在较高的 HttpWebRequest/WebClient 层内置了 http 代理支持 - 但您已经忽略了这一点。

我认为你的选择是:

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

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).
铃予 2024-10-28 19:50:42

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文