IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[C#][Remoting] Comment detecter que l'on est connecté ?


Sujet :

C#

  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut [C#][Remoting] Comment detecter que l'on est connecté ?
    Bonsoir,

    J'aurai voulu savoir si il était possible de detecter un problème de connexion au serveur lors de l'instanciation de l'objet distant.

    En fait j'ai ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    		private static void CreateRemoteInstance()
    		{
    			try
    			{
    				BinaryClientFormatterSinkProvider clientProvider =
    					new BinaryClientFormatterSinkProvider();
    				BinaryServerFormatterSinkProvider serverProvider =
    					new BinaryServerFormatterSinkProvider();
     
    				serverProvider.TypeFilterLevel =
    				System.Runtime.Serialization.Formatters.TypeFilterLevel.Full;
     
    				IDictionary props = new Hashtable();
    				props["port"] = 0;
    				props["name"] = System.Guid.NewGuid().ToString();
    				props["typeFilterLevel"] = TypeFilterLevel.Full;
     
    				TcpChannel channel = new TcpChannel(props, clientProvider, serverProvider);
     
    				ChannelServices.RegisterChannel(channel, false);
     
    				Instance = (IEntite.IGroupeListe)Activator.GetObject(
    					typeof(IEntite.IGroupeListe),
    					"tcp://xpsp2-9848109dc:1069/GroupeSiteList");
    			}
    			catch
    			{
    				throw new Exception("Erreur de connexion au serveur"); 
    			}
    		}
    Mais si le serveur n'est pas lancé il ne passe pas dans mon catch....
    Et comme y'à pas vraiment de type "remoted" que je passe par Activator.GetObject, je vois pas bien comment connaitre l'état connecte/ non connecté de l'objet.

    Une idée ?

    merci,
    bye

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Peux-tu verifier ce que renvoie ici channel.ChannelData dans le cas d'un serveur connecté et dans le cas d'un serveur deconnecté.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    HHmm et bien voila ce que je peux récupérer :

    Deconnecté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -channel	{System.Runtime.Remoting.Channels.Tcp.TcpChannel}	System.Runtime.Remoting.Channels.Tcp.TcpChannel
    +ChannelData	{System.Runtime.Remoting.Channels.ChannelDataStore}	object {System.Runtime.Remoting. Channels.ChannelDataStore}
    	-ChannelUris	{Dimensions:[1]}	string[]
    			[0]	"tcp://10.197.213.22:1530"	string
    	+Non-Public members	
    ChannelName	"294e289d-fab1-40e1-8ace-5dd9e6ffaa27"	string
    ChannelPriority	1	int
    IsSecured	false	bool
    +Non-Public members

    Connecté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    -channel	{System.Runtime.Remoting.Channels.Tcp.TcpChannel}	System.Runtime.Remoting.Channels.Tcp.TcpChannel
    -ChannelData	{System.Runtime.Remoting.Channels.ChannelDataStore}	object {System.Runtime.Remoting.Channels.ChannelDataStore}
    	-ChannelUris	{Dimensions:[1]}	string[]
    		[0]	"tcp://10.197.213.22:1545"	string
    	+Non-Public members		
    ChannelName	"1611e5b9-6d3b-4b3c-9c96-1eb5a38b1124"	string
    ChannelPriority	1	int
    IsSecured	false	bool
    +Non-Public members
    A priori, je ne voit pas trop quoi récupérer de public sur l'état de la connection. :s (Enfin même dans les propriétés privée je n'ai rien trouvé )

    C'est un peu nul pour sa le remoting...
    Je ne peut le savoir que qd j'appelle une méthode distante.. Qui lance un System.Net.Sockets.SocketException
    Ce qui n'est pas tip top.

    Si tu as une autre idée j'essaierais voir volontier.

    Merci

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Ben avant c'est un peu dommage que tu te sois arrêté en cours de route sur ma première suggestion
    Transtype l'objet que tu reçois par ChannelData en ChannelDataStore et liste tout ce que contient cet objet (ce sont que des string). Alors seulement on pourra dire qu'il n'y a rien qui reflète l'état connecté ou pas.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Ben avant c'est un peu dommage que tu te sois arrêté en cours de route sur ma première suggestion
    Je n'avais pas vu si loin :s

    Mais voila ce que cela donne après un cast :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChannelDataStoreC = (ChannelDataStore)channel.ChannelData;
    .

    Déconnecté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -C	{System.Runtime.Remoting.Channels.ChannelDataStore}	System.Runtime.Remoting.Channels.ChannelDataStore
    	-ChannelUris	{Dimensions:[1]}	string[]
    		[0]	"tcp://10.197.213.22:3940"	string
    	-Non-Public members		
    	-_channelURIs	{Dimensions:[1]}	string[]
    		[0]	"tcp://10.197.213.22:3940"	string
    		_extraData	null	System.Collections.DictionaryEntry[]
    Connecté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    -C	{System.Runtime.Remoting.Channels.ChannelDataStore}	System.Runtime.Remoting.Channels.ChannelDataStore
    	-ChannelUris	{Dimensions:[1]}	string[]
    		[0]	"tcp://10.197.213.22:3932"	string
    	-Non-Public members		
    	-_channelURIs	{Dimensions:[1]}	string[]
    		[0]	"tcp://10.197.213.22:3932"	string
    		_extraData	null	System.Collections.DictionaryEntry[]
    Pour ce qui est de parcourir l'objet j'ai essayé cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    				IChannelDataStore mp = (IChannelDataStore)channel.ChannelData;
    				IChannelDataStore myIChannelData;
    				foreach (object myChannelData in mp)
    				{
    					foreach (string myUri in ((IChannelDataStore)myChannelData).ChannelUris)
    						System.Windows.Forms.MessageBox.Show("Channel Uris are -> " + myUri);
    				}
    Sauf que,
    Error 1 foreach statement cannot operate on variables of type 'System.Runtime.Remoting.Channels.IChannelDataStore' because 'System.Runtime.Remoting.Channels.IChannelDataStore' does not contain a public definition for 'GetEnumerator' F:\Documents and Settings\Admin\Mes documents\Visual Studio 2005\Projects\Gestionnaire de site webs\WebsiteManagement\Entite_site\EntiteSiteListRemoted.cs 56 5 WebsiteManagement


    Encore merci

  6. #6
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Je suis désolé de constater que finalement tout cela semble mener vers une impasse.
    Finalement la piste la plus sérieuse à :
    Citation Envoyé par ePoX
    J'aurai voulu savoir si il était possible de detecter un problème de connexion au serveur lors de l'instanciation de l'objet distant.
    serait: Comment detecter un problème de connexion au serveur AVANT l'instanciation de l'objet distant. Soit proceder en deux temps tel cet algo:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if (this.IsConnected())
     {
         //ton code remoting
      }
    else
    {
       Console.WriteLine("C'est pas la peine d'essayer")
    }
    La méthode IsConnected() doit être implementée d'une tout autre manière spécifique (PIng ou autre) pour verifier si le serveur est accessible sur le reseau.
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Je suis désolé de constater que finalement tout cela semble mener vers une impasse.
    pas grave sa m'a donné une bonne raison d'utiliser les outils de debug


    Je pense qu'effectivement je vais utiliser le ping, c'est une bonne idée sa

    MErci pour tout neguib

    bye

  8. #8
    Membre expert

    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 737
    Points : 3 137
    Points
    3 137
    Par défaut
    Citation Envoyé par ePoX
    Je pense qu'effectivement je vais utiliser le ping, c'est une bonne idée sa
    ca te dira juste si ton serveur est joignable, mais en aucun cas si ton programe tourne

    tu utilises quelle version de .Net ?

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    ca te dira juste si ton serveur est joignable, mais en aucun cas si ton programe tourne
    tu utilises quelle version de .Net ?
    2.0
    Hm oui je sais... Je ne sais même pas encore si je peux detecter le port ouvert... Je pensais à utiliser une alternative avec un socket.. Mais je ne connais pas très bien les possibilité réseaux pour ces problèmes, je vais étudier la chose !

    Si vous avez quelques remarques ou idées je suis preneur

    bye

  10. #10
    Membre expert

    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 737
    Points : 3 137
    Points
    3 137
    Par défaut
    mais je comprends pas trop, pasque j'avais commencé mon projet avec une partie en remoting et quand le serveur était coupé, ca me lançait une exception de type socketexception justement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "Aucune connexion n'a pu être établie car l'ordinateur cible l'a expressément refusée"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Server stack trace: 
       à System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
       à System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
       à System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket(EndPoint ipEndPoint)
       à System.Runtime.Remoting.Channels.RemoteConnection.CreateNewSocket()
       à System.Runtime.Remoting.Channels.SocketCache.GetSocket(String machinePortAndSid, Boolean openNew)
       à System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.SendRequestWithRetry(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream)
       à System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
       à System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
     
    Exception rethrown at [0]: 
       à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       à System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
       à Arstecne.Postes.CoreSecured.SecuredCore.get_InitOK()
       à Interface.frmMain..ctor() dans F:\Arstecne\Postes\Interface\frmMain.vb:ligne 136
       à Interface.frmLogin..ctor() dans F:\Arstecne\Postes\Interface\frmLogin.vb:ligne 38
    pourquoi ca te sort pas ca chez toi

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Oui sa me sort bien cette exception sauf que je la récuprère dans le main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
            [STAThread]
            static void Main()
            {
    			try{
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                Application.Run(new Form1());
                }catch(Exception Ex)
                {
    				if(Ex.InnerException != null)
    				{
    					MessageBox.Show(Ex.InnerException.Message + " -- " + Ex.InnerException.StackTrace
    					+ " -- " + Ex.InnerException.Source);
    				}
    				else
    				{
    					MessageBox.Show(Ex.Message + " -- " + Ex.StackTrace
    					+ " -- " + Ex.Source);
    				}
                }
            }

    Je débute en application sur client lourd, mais dans le genre crade je pense ne pas encore avoir fait mieux !

    J'aurais préféré, soit récupérer une exception à l'instanciation, soit detecter au préalable la disponibilité du serveur.

    Actuellement, j'ai pu determiner que cette exception était levé lors du premier appel à une des méthodes de l'objet remoter.

    Mais bon c'est bof bof...

  12. #12
    Membre expert

    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 737
    Points : 3 137
    Points
    3 137
    Par défaut
    ton exception devrait etre levée a l'intérieur meme de la fonction que tu as copiée dans ton premier post, je capte vraiment plus rien la

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Citation Envoyé par Olivier Delmotte
    ton exception devrait etre levée a l'intérieur meme de la fonction que tu as copiée dans ton premier post, je capte vraiment plus rien la
    Oui ! Ce serait le la voie naturel des choses :/

    Je pense que c'est du au mode d'activation de l'objet distant, ici je suis en singleton.
    Ce qui me fait dire cela, c'est que si le serveur leve une exception en cours d'execution, les clients n'en sont pas explicitement avertit et peuvent continuer à vire tant qu'il ne font pas appel au serveur.

    D'ou l'exception levée lors du premier appel à une méthode distante dans mon problème expliqué ici.

    Enfin, j'imagine..

  14. #14
    Membre expert

    Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2003
    Messages
    1 737
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 737
    Points : 3 137
    Points
    3 137
    Par défaut
    tu peux réexposer ton problème comme si tu n'avais jamais créé ce poste, tu m'embrouilles la

    donne plus de détails, ce que tu cherches à faire exactement, ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/02/2008, 21h38
  2. Réponses: 15
    Dernier message: 05/11/2007, 12h20
  3. Réponses: 3
    Dernier message: 17/11/2006, 20h19
  4. Réponses: 2
    Dernier message: 16/06/2006, 22h07
  5. Réponses: 1
    Dernier message: 12/06/2006, 15h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo