Иногда при чтении сокета из TcpClient class
поток поступает без мгновенной интерпретации данных. Например, если я подключаюсь к IRC-серверу и хочу интерпретировать текст в канале для распознавания команд. Если кто-то наберет команду, !time
и !time
- допустимая функция, она вернет на сервер текущее время.
Проблема в том, что если кто-то спамит эту же команду !time
с высокой скоростью, сокет будет затоплен. Если кто-то еще попытается выполнить !time
, он не будет выполнять обратную запись на сервер до тех пор, пока цикл while () не завершит чтение потока затопленных сокетов. Это может занять минуты, если не совсем, если пользователь продолжал рассылать спам / заливать команду.
static void Connect(String hostname, int port)
{
try
{
socket = new TcpClient(hostname, port);
socket.ReceiveBufferSize = 4096;
Console.WriteLine("Successfully connected to " + hostname);
NetworkStream stream = socket.GetStream();
reader = new StreamReader(stream);
writer = new StreamWriter(stream);
write("USER " + username + " 8 * :" + description, writer);
write("NICK " + username, writer);
write("NS IDENTIFY " + password, writer);//Authenticate account
read(reader);//read the stream
reader.Close();
writer.Close();
stream.Close();
socket.Close();
}
catch
{
Console.WriteLine("Failed to connect to " + hostname);
}
}
функция read () ниже:
static void read(StreamReader reader)
{
try
{
while (true)
{
interpret(reader.ReadLine());
}
}
catch
{
Console.WriteLine("Unable to read from server");
}
}
Что я мог сделать, чтобы поток не пострадал, если бы он был затоплен? Так что, если кто-то затопит поток с помощью !time
, это не помешает другим пользователям также видеть время, если они наберут !time
.
Спасибо.