Déconnexion de TcpClient lors de la lecture asynchrone

J’ai quelques questions à propos de la finition d’une connexion TCP.

  1. Un client se connecte à mon serveur à l’aide de TCP, après avoir accepté le client avec listener.BeginAcceptTcpClient(ConnectionEstabilishedCallback, null); , Je commence à lire avec networkStream.BeginRead(....) .
    Que se passe-t-il lorsque le client se déconnecte pendant que j’attends un message? (par exemple, il perd son alimentation, Internet, etc.)
    Comment puis-je savoir quand cela se produit?

  2. Si après une lecture réussie, je fais des choses, puis appelle networkStream.Close(); client.Close(); networkStream.Close(); client.Close(); Que verra le client? Comment puis-je mettre fin à la connexion “gracieusement”?

  3. Que se passe-t-il si j’attends une lecture (avec BeginRead), puis ferme (sur un autre thread) le même stream?

EDIT TO ADD: J’ai un message ping-pong entre le client et le serveur. Est-ce suffisant? Si je ne reçois pas de ping, termine mon NetworkStream? sûrement il doit y avoir quelque chose de mieux.

1- Si le client s’est déconnecté en raison d’un câble débranché, vous ne le saurez pas avant la prochaine lecture ou écriture sur le socket. Notez également que la valeur de la propriété tcpClient.Connected n’est pas fiable, elle dépend de la dernière communication. Donc, si la dernière communication a abouti, sa valeur est true, sinon elle est fausse. pour plus d’informations sur ce vérifier ceci .

2- Si vous fermez le stream réseau et le client, il s’agit de la fermeture harmonieuse du client.

3- Je ne sais pas, fais un test.

Si vous vous rendez compte que la connexion est perdue à cause d’un câble débranché ou autre, alors pour obtenir la valeur IsConnected appropriée, vous devez être conscient de la perte de connexion au cours de la lecture ou de l’écriture sur le tcp. -catch autour de son fonctionnement ….

Utilisez cette propriété IsConnected pour vérifier si le tcpClient est connecté:

 public static bool IsConnected { get { try { //return _tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected; if (_tcpClient != null && _tcpClient.Client != null && _tcpClient.Client.Connected) { /* As the documentation: * When passing SelectMode.SelectRead as a parameter to the Poll method it will return * -either- true if Socket.Listen(Int32) has been called and a connection is pending; * -or- true if data is available for reading; * -or- true if the connection has been closed, reset, or terminated; * otherwise, returns false */ // Detect if client disconnected if (_tcpClient.Client.Poll(0, SelectMode.SelectRead)) { byte[] buff = new byte[1]; if (_tcpClient.Client.Receive(buff, SocketFlags.Peek) == 0) { // Client disconnected return false; } else { return true; } } return true; } else { return false; } } catch { return false; } } } 

Que se passe-t-il lorsque le client se déconnecte pendant que j’attends un message? (par exemple, il perd son alimentation, Internet, etc.) Comment savoir quand cela se produit?

Différentes choses se produisent pour différentes raisons de déconnexion.

Une déconnexion socket.EndRead est détectée lorsque vous recevez 0 octet de socket.EndRead . D’autres arrêts mèneront à SocketException pour EndRead ou Send

Si après une lecture réussie, je fais des choses, puis appelle networkStream.Close (); client.Close (); Que verra le client? Comment puis-je mettre fin à la connexion “gracieusement”?

Close le fera gracieusement.

Que se passe-t-il si j’attends une lecture (avec BeginRead), puis ferme (sur un autre thread) le même stream?

Vous obtiendrez une exception. ObjectDisposedException (si vous disposez du client) ou IOException

 public class Example { static NetworkStream stream; static TcpClient client; public static void Main(Ssortingng[] args) Ssortingng message = Ssortingng.Empty; //TCP connection Recon: Console.WriteLine("Connecting..."); Int32 port = 3333; try { client = new TcpClient("ip.ip.ip.ip", port); //Try to connect } catch { Console.WriteLine("Problem while connecting!"); Thread.Sleep(10000); //Waiting 10s before reconnect goto Recon; } Console.WriteLine("Connection established!\n"); stream = client.GetStream(); while (true) { //Buffer byte[] received_bytes = new Byte[1024]; message = ""; Console.WriteLine("Waiting to receive message...\n"); Int32 bytes = stream.Read(received_bytes, 0, received_bytes.Length); message = System.Text.Encoding.GetEncoding("iso-8859-1").GetSsortingng(received_bytes, 0, bytes); if (bytes == 0) //If connection abort while reading { Console.WriteLine("Connection failed!"); //Recconecting goto Recon; } Console.WriteLine("Received message: " + message); } } }