3

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;
}

このコードに何を追加しますか?

4

2 に答える 2

3

明らかに http Web リクエストを作成しているときに、使用したくないと言った理由がよくわかりませんWebRequest(または、私は想像WebClientします)。しかし、理由があると思います!

要するに、.Net で SOCKS プロキシをサポートする方法が組み込まれておらず、ソケットと同じくらい低いレベルで http プロキシをサポートしていません (リクエストが確実に処理されるという保証がないため、これほど低いレベルでは意味がありません)。 http リクエスト)。HttpWebRequest.Net の上位/レイヤーには http プロキシ サポートが組み込まれてWebClientいますが、これはすでに割引されています。

あなたの選択肢は次のとおりだと思います:

  • ジョブに適したツール (HttpWebRequestまたはWebClient) を使用して、http プロキシ サポートを無料で入手してください。
  • SOCKS サポートのサード パーティの実装を使用します。Google 検索を行うと、そのうちのいくつかが表示されます。(たとえば、これ)。
于 2011-03-15T00:42:25.513 に答える
2

実際の場所へのソケットを開く代わりに、プロキシへのソケットを開こうとします。

于 2011-03-15T05:14:44.650 に答える