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));
}
}
}
Le problème est que même avec un tampon aussi grand que court. MaxValeur, vous pouvez réellement remplir le tampon. Lorsque vous séparez la chaîne que vous créez à partir du tampon, la dernière chaîne est tronquée, et le reste vient avec la lecture suivante. Je pensais créer un buffer assez grand pour une seule ligne (ce qui selon la RFC2812 est de 512 caractères), extraire une sous-chaîne jusqu'au premier "\ r \ n", puis copier en tableau le reste des données au début du tampon et en utilisant le paramètre offset pour lire plus de données sur la fin de la donnée qui n'a pas été extraite la dernière itération. Désolé si c'était difficile à suivre ...IRC utilisant NetworkStream - le tampon se remplit et la ligne est tronquée
Est-ce la meilleure solution, ou est-ce que je manque l'évidence ici?
êtes-vous sûr que le tampon est plein, pas que 'bytesRead' n'est pas la même taille que le nombre d'octets envoyés? –
Cela pourrait être le cas - mais ce n'est généralement pas le cas. – carlsb3rg