var buffer = new byte[short.MaxValue];
var splitString = new string[] {"\r\n"};
while (_tcpClient.Connected)
{
if (!_networkStream.CanRead || !_networkStream.DataAvailable)
continue;
var bytesRead = _networkStream.Read(buffer, 0, buffer.Length);
var stringBuffer = Encoding.ASCII.GetString(buffer, 0, bytesRead);
var messages =
stringBuffer.Split(splitString, StringSplitOptions.RemoveEmptyEntries);
foreach (var message in messages)
{
if (MessageReceived != null)
{
MessageReceived(this, new SimpleTextClientEventArgs(message));
}
}
}
Проблема в том, что даже с буфером размером с Short.MaxValue вы можете фактически заполнить буфер. Когда вы разделяете строку, создаваемую из буфера, последняя строка прерывается, а остальная часть - со следующим чтением.IRC, использующий NetworkStream - заполнение буфера и линия попадают в ловушку
Я думал о создании буфера, достаточно большого для одной строки (которая по RFC2812 составляет 512 символов), извлекая подстроку до первого «\ r \ n», а затем копируя остальную часть данных к началу буфера и используя параметр offset, чтобы читать больше данных на конце данных, которые не были извлечены последней итерацией. Извините, если это было трудно ...
Это лучшее решение, или я пропустил здесь очевидное?
вы уверены, что буфер заполнен, не то, что 'bytesRead' не того же размера, что и количество отправленных байтов? –
Это может быть так, но обычно это не так. – carlsb3rg