2014-03-06 7 views
2

동일한 컴퓨터에서 하위 프로세스를 생성하는 Windows 서비스가 있습니다. 그들은 TCP 리모팅을 통해 두 가지 방법으로 통신합니다. 자식 프로세스는 부모에게 핑 핑하는 데 아무런 문제가 없지만 부모 클라이언트에서 자식 프로세스의 원격 서비스로의 ping 호출은 결코 반환되지 않습니다.원격 호출이 절대 반환되지 않습니다.

로그는 자식 프로세스가 서버 채널을 예상 포트 및 서비스 이름으로 등록하는 것을 보여줍니다. 그러나 127.0.0.1을 호스트로 제공하지만 ChannelData의 uri 값을 보면 루프백 주소 대신 실제 IP 주소가 표시됩니다. 127.0.0.1 대신이 실제 IP 주소로 하위 서버 채널을 등록해도 아무런 차이가 없습니다.

하면 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를 추가해도 트릭이 수행되지 않았으며 관련 포트에서 방화벽 규칙을 명시 적으로 설정하거나 설정하지 않았습니다.

자식 프로세스가 완전히 설정되기 전에 클라이언트가 원격 개체를 활성화하지 않도록 상호 프로세스를 동기화합니다.

아이디어가 있으십니까? 부모에

클라이언트 설치 :

public IpcCallResponseData PingHostedProcess(int processId) 
{ 
    return Service.Ping(new IpcCallRequestData(processId)); 
} 

Server 설치 자식 :

: 아이에

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); 
} 

서비스 부모에

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 Ping(IpcCallRequestData data) 
{ 
    ... some processing ... 
    return new IpcCallResponseData(_processId); 
} 

답변

1

양방향 통신을 원한다면 클라이언트와 서버 모두 클라이언트와 서버 채널을 모두 등록해야합니다.

바라기를 만들고 RemotingTcpServer에서 TcpClientChannel를 등록하고 생성하고이 작동 동일한 포트에서 수신 대기 RemotingTcpClientTcpServerChannel를 등록하면!

+0

당연히 나는 양쪽 서버와 클라이언트를 등록합니다. 관련없는 코드로 내 질문을 망칠 수 없도록 문제가되는 방향과 관련된 코드 만 붙여 넣었습니다. – Dondey

관련 문제