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