Bonjour,

J'ai créé un système de communication client(s)-serveur. Étant un système qui sera utilisé dans l'industrie sur une machine qui doit tourner en permanence il faut que mon code soit fiable dans son exécution.

Je cherche donc à gérer les déconnexions entre le client et le serveur.

Mon premier point a été de me dire: Si il y a déconnexion, je tente des reconnexions en chaine, voici donc mon code pour tester la connexion (fonctionne avec un timer):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
private void testConnexion(Object obj, ElapsedEventArgs args) {
    //récupère l'état de la connexion avec le serveur
    _connexionEtablie = _connexionAuServeur.IsConnected();
    nouvelEtatConnexion(_connexionEtablie);
 
    if (!_connexionEtablie) {
        //tentative de reconnexionAuServeur
        reconnexionAuServeur();
    } else {
        _attenteReconnexion.Set();
    }
}
La fonction IsConnected (extension de TcpClient):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static bool IsConnected(this TcpClient client) {
    if (client.Connected) {
        byte[] buffer = new byte[1];
        if ((client.Client.Poll(0, SelectMode.SelectRead)) && (!client.Client.Poll(0, SelectMode.SelectError))) {
 
            int result = client.Client.Receive(buffer, SocketFlags.Peek);
            return result != 0;
        } else {
            return false;
        }
    } else {
        return false;
    }
}
La deuxième chose à gérer sont les messages envoyés partiellement. Pour régler ça je me suis dit qu'il suffisait de lire le message, vérifier son format et s'il était mauvais, regarder son identifiant était disponible dans le message. Si l'identifiant pouvait être trouvé, alors je renvoyais au client/serveur une demande de renvoi du message.

Sauf que cela ne fonctionnera pas dans mon cas étant donné que le ReadString() de mon BinaryReader ne lira (à priori) pas ce message étant donné qu'il attend des bits qu'il ne reçoit pas.
La logique voudrait donc qu'il coince tout le système (parce qu'il est bloquant).

Je pourrais aussi, avant d'exécuter ReadString() vérifier l'état de la connexion et récupérer le contenu du stream dans le cas où la connexion n'est plus en marche, flush puis attendre la reconnexion.

Je ne suis pas sur de la bonne manière de gérer cet évènement, j'aimerais connaitre votre avis concernant mon problème, que je ne fasse pas d'erreur et que je n’oublie de gérer certains cas.

Merci