Hallo zusammen!
Ich habe eine Client-/Serveranwendung geschrieben, die Remoting benutzt.
Auf der Severseite habe ich folgendes:
Auf der Clientseite folgendes:
Wenn sich Client und Server am gleichen PC befinden und ich über localhost gehe, gibt es keine Probleme. Stehen Client und Server aber hinter einem NAT-Router, passiert folgendes:
Wenn ich vom Client aus am Server Register() aufrufe, dann gibt es eine SocketException an der Stelle, wo der Server den Client mit einem Methodenaufruf zurückrufen soll.
Vielleicht kennt jemand das Problem und kann mir helfen? Danke
Martin
Ich habe eine Client-/Serveranwendung geschrieben, die Remoting benutzt.
Auf der Severseite habe ich folgendes:
Code:
public void RegisterPort(int port) { string urlEnd = DCTServer.Properties.Settings.Default.LAST_PART_OF_URL; IDictionary props = new Hashtable(); BinaryServerFormatterSinkProvider bsfsp = new BinaryServerFormatterSinkProvider(); RemotingConfiguration.CustomErrorsMode = CustomErrorsModes.Off; int timeout = DCTServer.Properties.Settings.Default.TIMEOUT_S * 1000; props.Add("port", port); bsfsp.TypeFilterLevel = TypeFilterLevel.Full; props.Add("timeout", timeout); props.Add("customErrors", true); channel = new TcpChannel(props, null, bsfsp); ChannelServices.RegisterChannel(channel, false); RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server), urlEnd, WellKnownObjectMode.Singleton); } public IServerFunctions Register(string nickname, IClient cf) { ServerFunctions sf; /* * Hier gibt es die SocketException. Der Client meldet sich * nicht mehr... */ if(cf.Hello(false)) { throw new Exception("Hello hat nicht das Argument zurückgegeben."); } sf = new ServerFunctions(nickname); return sf; }
Code:
public IServerFunctions ConnectToServer(string URI, string nickname, IClient clientFunctions) { IDictionary props = new Hashtable(); IServerFunctions serverFunctions; int timeout = DCTClient.Properties.Settings.Default.TIMEOUT_S * 1000; props.Add("port", 5030); props.Add("timeout", timeout); BinaryClientFormatterSinkProvider bcfsp = new BinaryClientFormatterSinkProvider(); IChannel channel = new TcpChannel(props, bcfsp, null); ChannelServices.RegisterChannel(channel, false); server = (IServer)Activator.GetObject(typeof(IServer), URI); serverFunctions = server.Register(nickname, clientFunctions); if (serverFunctions.Hello(false)) { throw new Exception("Methodenaufruf am Server nicht möglich."); } return serverFunctions; }
Wenn ich vom Client aus am Server Register() aufrufe, dann gibt es eine SocketException an der Stelle, wo der Server den Client mit einem Methodenaufruf zurückrufen soll.
Vielleicht kennt jemand das Problem und kann mir helfen? Danke
Martin
Comment