14

プログラムでTor制御ポートにコマンドを送信して、チェーンを更新しようとしています。C#で例を見つけることができず、ソリューションが機能していません。リクエストがタイムアウトします。サービスを実行していますが、制御ポートでリッスンしているのを確認できます。

public string Refresh()
{
    TcpClient client = new TcpClient("localhost", 9051);
    string response = string.Empty;
    string authenticate = MakeTcpRequest("AUTHENTICATE\r\n", client);
    if (authenticate.Equals("250"))
    {
        response = MakeTcpRequest("SIGNAL NEWNYM\r\n", client);
    }
    client.Close();
    return response;
}

public string MakeTcpRequest(string message, TcpClient client)
{
    client.ReceiveTimeout = 20000;
    client.SendTimeout = 20000;
    string proxyResponse = string.Empty;

    try
    {
        // Send message
        StreamWriter streamWriter = new StreamWriter(client.GetStream());
        streamWriter.Write(message);
        streamWriter.Flush();

        // Read response
        StreamReader streamReader = new StreamReader(client.GetStream());
        proxyResponse = streamReader.ReadToEnd();
    }
    catch (Exception ex)
    {
        // Ignore
    }

    return proxyResponse;
}

誰かが私が間違っていることを見つけることができますか?

編集:

ハンスの提案に続いて、彼は何らかの理由で削除しましたが、私は単に「AUTHENTICATE」ではなく「AUTHENTICATE\n」を送信しようとしました。Torからエラーが返ってきました:「551引用符で囲まれた文字列が無効です。パスワードを二重引用符で囲む必要があります。」少なくともある程度の進歩はあります。

次に、「AUTHENTICATE \ "\" \ n」を送信しようとしましたが、応答を待っている間にタイムアウトになりました。

編集:

このコマンドは、WindowsTelnetクライアントで正常に機能します。引用符を追加する必要もありません。何が悪いのか理解できません。二重引用符は、送信時に正しくエンコードされていない可能性がありますか?

4

4 に答える 4

8
    public static void CheckIfBlocked(ref HtmlDocument htmlDoc, string ypURL, HtmlWeb hw)
    {
        if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
        {
            Console.WriteLine("Getting Blocked");
            Utils.RefreshTor();
            htmlDoc = hw.Load(ypURL, "127.0.0.1", 8118, null, null);
            if (htmlDoc.DocumentNode.InnerText.Contains("FORBIDDEN ACCESS!"))
            {
                Console.WriteLine("Getting Blocked");
                Utils.RefreshTor();
            }
        }
    }
    public static void RefreshTor()
    {
        IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9051);
        Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        try
        {
            server.Connect(ip);
        }
        catch (SocketException e)
        {
            Console.WriteLine("Unable to connect to server.");
            RefreshTor();
            return;
        }

        server.Send(Encoding.ASCII.GetBytes("AUTHENTICATE \"butt\"\n"));
        byte[] data = new byte[1024];
        int receivedDataLength = server.Receive(data);
        string stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);

        if (stringData.Contains("250"))
        {
            server.Send(Encoding.ASCII.GetBytes("SIGNAL NEWNYM\r\n"));
            data = new byte[1024];
            receivedDataLength = server.Receive(data);
            stringData = Encoding.ASCII.GetString(data, 0, receivedDataLength);
            if (!stringData.Contains("250"))
            {
                Console.WriteLine("Unable to signal new user to server.");
                server.Shutdown(SocketShutdown.Both);
                server.Close();
                RefreshTor();
            }
        }
        else
        {
            Console.WriteLine("Unable to authenticate to server.");
            server.Shutdown(SocketShutdown.Both);
            server.Close();
            RefreshTor();
        }
        server.Shutdown(SocketShutdown.Both);
        server.Close();
    }
于 2011-08-25T14:53:00.557 に答える
4

AUTHENTICATEコマンドを送信すると、StreamReaderは最後まで応答を読み取っていますが、成功するとストリームが開いたままになるため、終わりはありません。そのため、この場合は応答の最初の行のみを読み取るように変更しました。

public static string MakeTcpRequest(string message, TcpClient client, bool readToEnd)
{
    client.ReceiveTimeout = 20000;
    client.SendTimeout = 20000;
    string proxyResponse = string.Empty;

    try
    {
        // Send message
        using (StreamWriter streamWriter = new StreamWriter(client.GetStream()))
        {
            streamWriter.Write(message);
            streamWriter.Flush();
        }

        // Read response
        using (StreamReader streamReader = new StreamReader(client.GetStream()))
        {
            proxyResponse = readToEnd ? streamReader.ReadToEnd() : streamReader.ReadLine();
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return proxyResponse;
}
于 2010-05-05T10:17:09.187 に答える
1
于 2015-10-01T06:21:45.147 に答える
0

おそらく、制御ポートアクセス用のハッシュパスワードを生成するVidaliaを使用しています。Torコンソールアプリを使用してtorrcファイルを設定する必要があります。

于 2012-02-21T19:04:06.330 に答える