Как использовать управляющий протокол Скалистой вершины в C#?

Я пытаюсь отправить команды в порт управления Скалистой вершины программно, чтобы заставить его обновить цепочку. Я не смог найти любые примеры в 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;
}

Кто-либо может определить то, что я делаю неправильно?

Править:

После предложения Hans, которое он теперь удалил по некоторым причинам, я пытался отправить, "AUTHENTICATE\n" вместо просто "ПРОХОДЯТ ПРОВЕРКУ ПОДЛИННОСТИ". Теперь я возвращаю ошибку от Скалистой вершины: "551 Недопустимая заключенная в кавычки строка. Необходимо поместить пароль в двойные кавычки". По крайней мере, существует некоторый прогресс.

Я затем пытался отправить, "ПРОХОДЯТ ПРОВЕРКУ ПОДЛИННОСТИ \"\" \n", как он хочет, но это испытывает таймаут при ожидании ответа.

Править:

Команда хорошо работает в клиенте Windows Telnet. Я не должен даже добавлять кавычки. Не может выяснить что случилось. Возможно, двойные кавычки не кодируются правильно, когда они отправляются?

14
задан Edgar 3 April 2012 в 15:11
поделиться

1 ответ

Когда я отправляю команду 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;
}
4
ответ дан 1 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: