Привет, У меня есть пользовательский клиент Telnet на C#. Я использую его для связи с серверами IMAP. Он работает как команда write, а затем получает ответ. Код испытания:Как синхронизировать чтение/запись в поток?
Telnet tc = new Telnet();
// setup server credentials
const string server = "pop.nexlink.net";
const int port = 140;
const int timeout = 70;
// establish server connection
tc.Setup(server, port, timeout);
// test initial server response
Console.WriteLine(tc.output);
// set-up a few commands to send
var array = new[] { "USER [email protected]", "PASS password", "QUIT" };
// while connected to server
if (tc.IsConnected)
{
foreach (string str in array)
{
// Show command on console
Console.WriteLine(str);
// Write to Stream
tc.WriteLine(str);
// Read from Stream
tc.Read();
// Test the Stream output
Console.Write(tc.output);
}
}
// close connection
tc.Disconnect();
Выход из вызова выше код:
- USER [email protected]
- + OK Добро пожаловать на сервер POP3 Atmail - Войти пользователь @ домен.
- + OK Пароль требуется.
- PASS пароль
- ВЫЙТИ
- + OK вошли в систему.
- + OK До свидания.
Это упрощенный пример, однако он показывает проблему состояния гонки. Выход из строки nr.6 должен появиться до nr. 5
В: Как с этим справиться?
Кажется, что все в порядке. Сервер получает сообщение «Выход», прежде чем он завершит вход пользователя в систему. –
Возможно. Ответ довольно случайный. Это зависит от скорости соединения, времени отклика сервера, количества возвращаемых данных. Это становится действительно беспорядочным, когда есть больше команд, каждый из которых запрашивает большие потоки. В целом Чтение происходит намного медленнее, чем Writes. – asyncpro