我有一个Windows服务,它在同一台机器上生成子进程。他们通过TCP远程通信双向通信。子进程ping父进程没有问题,但从父进程到子进程的远程服务的ping调用永远不会返回。
日志显示子进程使用预期的端口和服务名称注册服务器通道。但是,我提供127.0.0.1作为主机,但是当查看ChannelData中的uri值时,我看到了机器的实际IP地址而不是环回地址。使用此实际IP地址而不是127.0.0.1注册子服务器通道没有任何区别。
Netstat表示预期的端口正在侦听:
TCP 0.0.0.0:23167 pc-name:0 LISTENING hostingProcId
TCP 0.0.0.0:23461 pc-name:0 LISTENING hostedProcId
该服务是WellKnownObjectMode.Singleton。我不知道以下信息是否重要,但为了以防万一,我不会覆盖可编组对象的InitializeLifetimeService。
在cahnnel属性中添加secure = false并不能解决问题,也没有明确设置相关端口上的防火墙规则。
我同步跨进程以确保客户端在子进程完全设置之前不会尝试激活远程对象。
有什么想法吗?
父母的客户端设置:
protected RemotingTcpClient(IpcUniplexConfig config)
{
Host = config.Host;
Port = config.Port;
ServiceName = config.ServiceName;
var props = new Hashtable();
props["name"] = ServiceName;
props["timeout"] = config.Timeout;
Channel = new TcpClientChannel(props, null);
ChannelServices.RegisterChannel(Channel, true);
var uri = string.Format("tcp://{0}:{1}/{2}", Host, Port, ServiceName);
Service = (TService)Activator.GetObject(typeof(TService), uri);
}
父母的客户:
public IpcCallResponseData PingHostedProcess(int processId)
{
return Service.Ping(new IpcCallRequestData(processId));
}
孩子的服务器设置:
protected RemotingTcpServer(IpcUniplexConfig config, TService service, WellKnownObjectMode objectMode)
{
Port = config.Port;
Service = service;
var props = new Hashtable();
props["port"] = Port;
props["name"] = service.ServiceName;
Channel = new TcpServerChannel(props, null);
ChannelServices.RegisterChannel(Channel, true);
RemotingConfiguration.RegisterWellKnownServiceType(Service.GetType(), Service.ServiceName, objectMode);
}
对孩子的服务:
public IpcCallResponseData Ping(IpcCallRequestData data)
{
... some processing ...
return new IpcCallResponseData(_processId);
}
答案 0 :(得分:1)
如果您想要双向通信,那么您的客户端和服务器都需要注册客户端和服务器通道。
希望如果您在TcpClientChannel
中创建并注册RemotingTcpServer
,那么在TcpServerChannel
中创建并注册一个RemotingTcpClient
,它可以监听它可能在同一个端口上工作!