2012-02-17 2 views
2

작업 (재로드)을 수행하기 위해 1 - 많은 클라이언트에 통지해야합니다. 특정 시점에서 서버가 실행 중이거나 실행되지 않았을 수 있습니다. 이러한 이유 때문에 클라이언트가 누구이고 서버가 누구인지를 정의하는 데 약간의 어려움이 있습니다.내 상황에 적합한 IPC 양식

언제든지 서버가 실행될 수 있습니다. 서버가 닫히면 모든 클라이언트에게 작업 수행을 알립니다.

를 사용하고 "클라이언트"에서 여러 인스턴스를 실행 해 보았습니다 (관계가 이상하다는 사실을 기억해야합니다). 유감스럽게도 주어진 서버 이름에 대해 하나의 파이프 서버 만 만들 수 있습니다. 그래서 이것은 효과가 없었습니다. 클라이언트를 계속해서 서버를 확인할 수도 있지만 폴링을 시작하면 DB를 직접 폴링 할 수도 있습니다.

내 상황은 대략 관찰자 패턴과 비슷합니다. 나는 동적으로 구독/탈퇴 할 필요가 없다. 나는 서버가 작업을 수행하기 위해 모든 실행중인 클라이언트에게 통지를 보내길 원한다.

어떻게하면됩니까? IPC와 함께해야한다는 것을 명심하십시오. 서버/클라이언트는 다른 프로세스에서 실행되며 항상 동일한 시스템에서 실행됩니다.

+0

서버 프로세스이고 여러 클라이언트 프로세스 **가 ** 동일한 시스템에 있거나 서버가 네트워크 주소에 상주 할 수 있습니까? –

+0

@ScottChamberlain - 같은 기계. 만약 UDP 나 어떤 형태의 네트워크 통신 만이 이것을 할 수있는 유일한 방법이라면 나는 그것에 대해 개방적이다. –

+0

동일한 기계가 보장되어 더 많은 옵션이 열립니다. –

답변

3

폴링 문제를 해결하기 위해 클라이언트 프로세스가 수신 대기하는 ManualResetEvent라는 이름을 만들 수 있습니다. 클라이언트는 스레드를 시작한 다음 이벤트를 기다립니다. 서버가 시작될 때 이벤트를 알리고 모든 클라이언트가 현재와 같이 명명 된 파이프를 열 수있는 청취 코드를 시작하게합니다. EventWaitHandle.GetAccessControl MSDN 페이지에서 이름이 지정된 ManualResetEvent를 만드는 방법의 예를 확인하십시오.

I can only create one Pipe server for any given server name. 문제의 경우 클라이언트가 실행되는 서버가 여러 개인 경우 어떤 서버를 연결해야하는지 클라이언트가 알고 있어야합니다. 당신은 그것이 클라이언트 관계에 대한 1 대의 서버라고 말했습니다. 여러 서버를 실행하려는 경우 클라이언트에게 어떤 서버를 청취해야하는지 알려줄 수있는 방법이 필요합니다.

+0

프로세스 경계를 ​​넘어 이벤트를 트리거 할 수 있다는 것을 알지 못했습니다. 이게 효과가 있니? 두 번째 부분에 대해서는 단 하나의 서버가 있습니다. 클라이언트는이 1 개의 서버에만 응답합니다. –

+0

예, 연결된 페이지의 예가 동일한 프로그램의 두 번의 실행에서 ManualResetEvent 신호를 보냅니다. 첫 번째 실행은 "서버"('doesNotExist = true')이고 두 번째 실행은 Named ManualResetEvent ('doesNotExist = false')가 "Client"로 바뀝니다.) –

+0

@Scott .Net의 EventWaitHandle을 사용하면 이름이 지정된 이벤트에 쉽게 연결할 수 있습니다. p/invoke를 바보처럼 사용하고 있습니다. . 내가 두 번 upvote 수 있다면. –

0

명명 된 공유 메모리를 사용하면 일대 다 통신을 수행 할 수 있습니다. 서버는 공유 메모리를 만들 수 있으며 하나 이상의 클라이언트가 열어서 읽을 수 있습니다. An example (in C) is shown here. 또한 a .NET example is shown here.

공유 메모리는 하나 이상의 프로세스에 열린 핸들이있는 한 존재합니다. OP에서 이것은 마치 서버 프로세스가 닫힌 후에도 메모리가 계속 존재할 수 있기 때문에 유용한 기능인 것처럼 들립니다 (적어도 하나의 클라이언트가 여전히 열려있는 한). 또한 .NET 예제는 정보를 유지하는 방법을 보여 주며, 프로세스를 오래 유지해야하는 경우 유용합니다.

필요한 타이밍에 따라 클라이언트는 필요한 정보를 주기적으로 메모리에서 읽을 수 있습니다. 시간이 더 중요한 상황이 발생하면 클라이언트에게 필요한 작업을 수행하라는 신호를 보내려면 명명 된 세마포를 사용할 수 있습니다. 동기화 개체로 세마포를 사용하면 릴리스 수를 1보다 큰 값으로 설정하여 여러 클라이언트에 신호를 보낼 수 있습니다.

1

프로세스가 모두 동일한 시스템에 있음을 보장 했으므로, 아마 named event이라는 창을 사용할 것입니다. 클라이언트와 서버는 OpenEvent으로 전화 할 수 있습니다. 이벤트가 생성되지 않은 경우 CreateEvent으로 전화하십시오. 이렇게하면 이벤트 당 몇 개의 클라이언트가 릴리스되는지에 대한 제어 기능 (pulseevent, set/reset 등 사용)을 제공 할뿐만 아니라 서버가없는 클라이언트를 열 수 있습니다.

Scott이 제안한 것처럼 쉽게 C#에서이 작업을 수행하려면 a.문자열과 같은 생성자를 호출하여 EventWaitHandle이라는 이름의 net을 만듭니다. 어떤 시스템 전체 동기화 개체를 만듭니다. 그 특정 생성자는 당신이 이벤트 (당신이 만든 이벤트)를 처음 요청했는지 또는 이미 존재했는지를 알려줍니다.

관련 문제