J'ai récemment commencé à étudier la programmation des sockets et j'ai écrit un serveur TCP asynchrone simple qui peut envoyer et recevoir des données de clients individuels sans problème. Voici le code simplifié :
//boucle d'acceptation
while (true)
{
var client = await listener.AcceptTcpClientAsync();
new AppClient(client).Start();
}
// et voici la méthode start dans la classe AppClient
public async void Start()
{
/// TcpClient est une propriété de classe qui est dans la portée de cette méthode
using (var stream = TcpClient.GetStream())
{
string message = string.Empty;
byte[] buffer = new byte[1000];
int bytesRead = 0;
while (true)
{
try
{
bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
break;
}
// décode le message texte simple
message += Encoding.UTF8.GetString(buffer, 0, bytesRead);
}
}
}
il gère des milliers de connexions de manière monofil dans une seule file, mais ce qui me contrarie, c'est que peu importe comment je détruis le client (en tuant le processus et ...), la méthode ReadAsync lance immédiatement une exception qui entre en conflit avec mes pensées. (aussi loin que j'ai lu, détecter une socket déconnectée en TCP ne devrait pas être si facile)
est-ce que je fais quelque chose de mal?