OVH Cloud OVH Cloud

help passer de TcpChannel vers IpcChanel

8 réponses
Avatar
Vincent
Bonjour j'ai un code qui permet à un client de faire du remote sur un
serveur en tpc :

tout çà marche bien, le client demande un service au serveur.

le client :

TcpChannel channel = new TcpChannel();

ChannelServices.RegisterChannel(channel, false);

remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
typeof(SYS_INTERFACE.IRemoteOperation),
"tcp://localhost:1069/RemoteOperation");


le serveur :

TcpChannel channel = new TcpChannel(1069);

ChannelServices.RegisterChannel(channel,false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),

"RemoteOperation", WellKnownObjectMode.Singleton);



je désirerai faire la même chose mais avec ipc, car pour des raisons de
sécurité, je ne veux pas qu'une machine distante communique avec mon
serveur.

seul un programme sur la même machine que le serveur ne doit pouvoir
communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc ?)

j'ai essaye plein de trucs mais ca ne marche pas . une idée ?



voici un code qui ne marche pas :)

le client :

IpcChannel channel = new IpcChannel();

ChannelServices.RegisterChannel(channel, false);

remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(

typeof(SYS_INTERFACE.IRemoteOperation),
"ipc://localhost:1069/RemoteOperation");



le serveur :



TcpChannel channel = new TcpChannel("localhost:1069");

ChannelServices.RegisterChannel(channel,false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),

"RemoteOperation", WellKnownObjectMode.Singleton);



la connection semble ok, mais quand le client demande un service (
additionner deux valeurs) il n'y a aucun retour

MERCI de votre AIDE



Vincent

8 réponses

Avatar
Arnaud CLERET
Bonsoir,

En fait le protocol IPC ne fonctionne pas selon les ports traditionnels. Il
est nécessaire d'utiliser un port nommé et unique.

Votre code devrait donc ressembler à ceci (remplacer "PortName" par le nom
de port souhaité) :

Coté client :

SYS_INTERFACE.IRemoteOperation remoteOperation =
Activator.GetObject(typeof(ISharedInterface<string>),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

Coté serveur :

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
"RemoteOperation", WellKnownObjectMode.Singleton);
IpcChannel channel = new IpcChannel("PortName");
ChannelServices.RegisterChannel(channel, false);

--
arno - http://www.dotnetguru2.org/acleret/


"Vincent" a écrit :

Bonjour j'ai un code qui permet à un client de faire du remote sur un
serveur en tpc :

tout çà marche bien, le client demande un service au serveur.

le client :

TcpChannel channel = new TcpChannel();

ChannelServices.RegisterChannel(channel, false);

remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
typeof(SYS_INTERFACE.IRemoteOperation),
"tcp://localhost:1069/RemoteOperation");


le serveur :

TcpChannel channel = new TcpChannel(1069);

ChannelServices.RegisterChannel(channel,false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),

"RemoteOperation", WellKnownObjectMode.Singleton);



je désirerai faire la même chose mais avec ipc, car pour des raisons de
sécurité, je ne veux pas qu'une machine distante communique avec mon
serveur.

seul un programme sur la même machine que le serveur ne doit pouvoir
communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc ?)

j'ai essaye plein de trucs mais ca ne marche pas . une idée ?



voici un code qui ne marche pas :)

le client :

IpcChannel channel = new IpcChannel();

ChannelServices.RegisterChannel(channel, false);

remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(

typeof(SYS_INTERFACE.IRemoteOperation),
"ipc://localhost:1069/RemoteOperation");



le serveur :



TcpChannel channel = new TcpChannel("localhost:1069");

ChannelServices.RegisterChannel(channel,false);

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),

"RemoteOperation", WellKnownObjectMode.Singleton);



la connection semble ok, mais quand le client demande un service (
additionner deux valeurs) il n'y a aucun retour

MERCI de votre AIDE



Vincent







Avatar
Arnaud CLERET
Oups ! ;)

Petite faute dans mon copier / coller : typeof(IRemoteOperation) et non
typeof(ISharedInterface<string>)

Le code client est donc :

SYS_INTERFACE.IRemoteOperation remoteOperation =
Activator.GetObject(typeof(IRemoteOperation),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

--
arno - http://www.dotnetguru2.org/acleret/


"Arnaud CLERET" a écrit :

Bonsoir,

En fait le protocol IPC ne fonctionne pas selon les ports traditionnels. Il
est nécessaire d'utiliser un port nommé et unique.

Votre code devrait donc ressembler à ceci (remplacer "PortName" par le nom
de port souhaité) :

Coté client :

SYS_INTERFACE.IRemoteOperation remoteOperation =
Activator.GetObject(typeof(ISharedInterface<string>),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

Coté serveur :

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
"RemoteOperation", WellKnownObjectMode.Singleton);
IpcChannel channel = new IpcChannel("PortName");
ChannelServices.RegisterChannel(channel, false);

--
arno - http://www.dotnetguru2.org/acleret/


"Vincent" a écrit :

> Bonjour j'ai un code qui permet à un client de faire du remote sur un
> serveur en tpc :
>
> tout çà marche bien, le client demande un service au serveur.
>
> le client :
>
> TcpChannel channel = new TcpChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
> typeof(SYS_INTERFACE.IRemoteOperation),
> "tcp://localhost:1069/RemoteOperation");
>
>
> le serveur :
>
> TcpChannel channel = new TcpChannel(1069);
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> je désirerai faire la même chose mais avec ipc, car pour des raisons de
> sécurité, je ne veux pas qu'une machine distante communique avec mon
> serveur.
>
> seul un programme sur la même machine que le serveur ne doit pouvoir
> communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc ?)
>
> j'ai essaye plein de trucs mais ca ne marche pas . une idée ?
>
>
>
> voici un code qui ne marche pas :)
>
> le client :
>
> IpcChannel channel = new IpcChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
>
> typeof(SYS_INTERFACE.IRemoteOperation),
> "ipc://localhost:1069/RemoteOperation");
>
>
>
> le serveur :
>
>
>
> TcpChannel channel = new TcpChannel("localhost:1069");
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> la connection semble ok, mais quand le client demande un service (
> additionner deux valeurs) il n'y a aucun retour
>
> MERCI de votre AIDE
>
>
>
> Vincent
>
>
>
>
>


Avatar
Vincent
Merci beaucoup, il est un peu tard.
Demain j'essaie tout çà

Vincent


"Arnaud CLERET" a écrit dans le message de
news:
Oups ! ;)

Petite faute dans mon copier / coller : typeof(IRemoteOperation) et non
typeof(ISharedInterface<string>)

Le code client est donc :

SYS_INTERFACE.IRemoteOperation remoteOperation > Activator.GetObject(typeof(IRemoteOperation),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

--
arno - http://www.dotnetguru2.org/acleret/


"Arnaud CLERET" a écrit :

Bonsoir,

En fait le protocol IPC ne fonctionne pas selon les ports traditionnels.
Il
est nécessaire d'utiliser un port nommé et unique.

Votre code devrait donc ressembler à ceci (remplacer "PortName" par le
nom
de port souhaité) :

Coté client :

SYS_INTERFACE.IRemoteOperation remoteOperation >> Activator.GetObject(typeof(ISharedInterface<string>),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

Coté serveur :

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
"RemoteOperation", WellKnownObjectMode.Singleton);
IpcChannel channel = new IpcChannel("PortName");
ChannelServices.RegisterChannel(channel, false);

--
arno - http://www.dotnetguru2.org/acleret/


"Vincent" a écrit :

> Bonjour j'ai un code qui permet à un client de faire du remote sur un
> serveur en tpc :
>
> tout çà marche bien, le client demande un service au serveur.
>
> le client :
>
> TcpChannel channel = new TcpChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
> typeof(SYS_INTERFACE.IRemoteOperation),
> "tcp://localhost:1069/RemoteOperation");
>
>
> le serveur :
>
> TcpChannel channel = new TcpChannel(1069);
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> je désirerai faire la même chose mais avec ipc, car pour des raisons de
> sécurité, je ne veux pas qu'une machine distante communique avec mon
> serveur.
>
> seul un programme sur la même machine que le serveur ne doit pouvoir
> communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc
> ?)
>
> j'ai essaye plein de trucs mais ca ne marche pas . une idée ?
>
>
>
> voici un code qui ne marche pas :)
>
> le client :
>
> IpcChannel channel = new IpcChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
>
> typeof(SYS_INTERFACE.IRemoteOperation),
> "ipc://localhost:1069/RemoteOperation");
>
>
>
> le serveur :
>
>
>
> TcpChannel channel = new TcpChannel("localhost:1069");
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> la connection semble ok, mais quand le client demande un service (
> additionner deux valeurs) il n'y a aucun retour
>
> MERCI de votre AIDE
>
>
>
> Vincent
>
>
>
>
>




Avatar
Vincent
Merci pour votre aide.

J'ai un serveur en mode console et un serveur en service windows.
Quand je remplace le code telquel (tcp -> ipc) en mode console ca marche
bien
mais en mode service windows ( je n'ai aucune erreur de signalée) le client
recoit une chaine vide.

je ne sais pas pourquoi ca ne marche pas quand mon serveur est un service
windows

Une idée ?

Merci
Vincent

"Vincent" a écrit dans le message de news:

Merci beaucoup, il est un peu tard.
Demain j'essaie tout çà

Vincent


"Arnaud CLERET" a écrit dans le message de
news:
Oups ! ;)

Petite faute dans mon copier / coller : typeof(IRemoteOperation) et non
typeof(ISharedInterface<string>)

Le code client est donc :

SYS_INTERFACE.IRemoteOperation remoteOperation >> Activator.GetObject(typeof(IRemoteOperation),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

--
arno - http://www.dotnetguru2.org/acleret/


"Arnaud CLERET" a écrit :

Bonsoir,

En fait le protocol IPC ne fonctionne pas selon les ports traditionnels.
Il
est nécessaire d'utiliser un port nommé et unique.

Votre code devrait donc ressembler à ceci (remplacer "PortName" par le
nom
de port souhaité) :

Coté client :

SYS_INTERFACE.IRemoteOperation remoteOperation >>> Activator.GetObject(typeof(ISharedInterface<string>),
"ipc://PortName/RemoteOperation") as SYS_INTERFACE.IRemoteOperation;

Coté serveur :

RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
"RemoteOperation", WellKnownObjectMode.Singleton);
IpcChannel channel = new IpcChannel("PortName");
ChannelServices.RegisterChannel(channel, false);

--
arno - http://www.dotnetguru2.org/acleret/


"Vincent" a écrit :

> Bonjour j'ai un code qui permet à un client de faire du remote sur un
> serveur en tpc :
>
> tout çà marche bien, le client demande un service au serveur.
>
> le client :
>
> TcpChannel channel = new TcpChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
> typeof(SYS_INTERFACE.IRemoteOperation),
> "tcp://localhost:1069/RemoteOperation");
>
>
> le serveur :
>
> TcpChannel channel = new TcpChannel(1069);
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> je désirerai faire la même chose mais avec ipc, car pour des raisons
> de
> sécurité, je ne veux pas qu'une machine distante communique avec mon
> serveur.
>
> seul un programme sur la même machine que le serveur ne doit pouvoir
> communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc
> ?)
>
> j'ai essaye plein de trucs mais ca ne marche pas . une idée ?
>
>
>
> voici un code qui ne marche pas :)
>
> le client :
>
> IpcChannel channel = new IpcChannel();
>
> ChannelServices.RegisterChannel(channel, false);
>
> remoteOperation = (SYS_INTERFACE.IRemoteOperation)Activator.GetObject(
>
> typeof(SYS_INTERFACE.IRemoteOperation),
> "ipc://localhost:1069/RemoteOperation");
>
>
>
> le serveur :
>
>
>
> TcpChannel channel = new TcpChannel("localhost:1069");
>
> ChannelServices.RegisterChannel(channel,false);
>
> RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteOperation),
>
> "RemoteOperation", WellKnownObjectMode.Singleton);
>
>
>
> la connection semble ok, mais quand le client demande un service (
> additionner deux valeurs) il n'y a aucun retour
>
> MERCI de votre AIDE
>
>
>
> Vincent
>
>
>
>
>








Avatar
Delf
Vincent a écrit :

je désirerai faire la même chose mais avec ipc, car pour des raisons de
sécurité, je ne veux pas qu'une machine distante communique avec mon
serveur.

seul un programme sur la même machine que le serveur ne doit pouvoir
communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc ?)



Salut, j'ai pas tout lu...

Pourquoi ne pas faire comme tu as fait par défaut en controlant que
l'adresse IP est bien la loopback ?

Ou n'autoriser l'accès au serveur qu'en local... ça permet de garder
tout de même l'aspect C/S, ce qui pourrait se révéler utile par la suite.

--
Delf
Avatar
Vincent
Je ne savais pas que c'était possible et comment il faut faire.
Mais j'ai une petite contrainte de sécurité, je dois éviter que le service
soit
solicité au point de se bloquer. A partir de là, la solution ipc semble plus
appropriée.

Ca devrait marcher, soit il y a un mauvais codage de ma part, un problème de
paramétrage ....
soit le service windows ne permet pas cette possibilité ...

Vincent



"Delf" a écrit dans le message de news:
451efc01$0$3819$
Vincent a écrit :

je désirerai faire la même chose mais avec ipc, car pour des raisons de
sécurité, je ne veux pas qu'une machine distante communique avec mon
serveur.

seul un programme sur la même machine que le serveur ne doit pouvoir
communiquer avec le serveur ( c'est bien ce que l'on obtient avec ipc ?)



Salut, j'ai pas tout lu...

Pourquoi ne pas faire comme tu as fait par défaut en controlant que
l'adresse IP est bien la loopback ?

Ou n'autoriser l'accès au serveur qu'en local... ça permet de garder tout
de même l'aspect C/S, ce qui pourrait se révéler utile par la suite.

--
Delf


Avatar
Delf
Vincent a écrit :

Je ne savais pas que c'était possible et comment il faut faire.
Mais j'ai une petite contrainte de sécurité, je dois éviter que le service
soit
solicité au point de se bloquer. A partir de là, la solution ipc semble plus
appropriée.



Bloqué, tu veux dire quoi par là ? Si c'est au nombre de
requêtes/connexions simultanées, c'est à toi de le gérer.

Pour écouter uniquement sur la loopback il doit y avoir une propriété
dans la classe System.Net (Address ?)

Si qq'un pouvait confirmer...

--
Delf
Avatar
Vincent
je n'arrive pa à m'en sortir .... je craque

si mon serveur est une console, en mode ipc ou ip tout fonctionne
si mon serveur est un service le mode ip fonctionne, le mode ipc ne
fonctionne pas.

il y a une exception lors de l'appel pour faire une addition :
Echec de la connexion à un port IPC, accès réfusé

y a un problème de droit ? comment gérer ce problème ?

Merci

Vincent