2010-12-29 2 views
4

클라이언트와 서버 사이에 로컬 IPC를 설정해야합니다. 단일 서버 및 다중 클라이언트의 경우이며 데이터를 양방향으로 교환해야합니다. 클라이언트는 명령 옵션을 보내는 명령이고 서버는 데이터를 가져 와서 클라이언트로 보냅니다. 클라이언트는 서버에서 수신 한 출력을 콘솔에 인쇄합니다.로컬 IPC를위한 POSIX 메시지 대기열 또는 유닉스 도메인 소켓

명령에서 보낸 데이터는 작지만 서버가 명령에 보낸 데이터는 거대합니다 (~ 11MB). Windows의 기존 디자인은 명명 된 파이프를 사용하여 65 킬로바이트 단위로 데이터를 보냅니다. 서버는 다른 터미널에서 동시에 다른 옵션으로 명령을 실행하는 것이 일반적이므로 여러 명령 클라이언트에 동시에 데이터를 전송해야합니다.

여러 프로세스의 데이터가 4096 바이트보다 큰 크기의 메시지에 대해 인터리브 될 수 있으므로 FIFO를 빠져 있습니다. 내가 틀렸다면 나를 바로 잡아주세요.

더 나은 선택 인 POSIX 메시지 대기열 또는 유닉스 도메인 소켓 인 아래의 두 가지 기준을 고려하십시오. 메시지

  1. 크기 (65K)가 여러 클라이언트
  2. 데이터가 인터리빙되지 않아야한다. 해당 클라이언트로 지정된 데이터 만 클라이언트에 의해 수신되어야합니다.

자세한 내용이 필요하면 알려주십시오. 당신은 소켓을 원하는처럼

안부, 히니 찬드라

답변

0

는 소리. 바인드를 사용하여 서버에 소켓을 설정하면 각 클라이언트가 연결될 때 서버가 분기하여 각 클라이언트를 개별적으로 처리하거나 select를 사용하여 클라이언트를 처리 할 수 ​​있습니다. 포크는 대개 간단합니다.

int sock = create and bind the socket to any port 

    while (1) { 
    int client = accept(sock); 
    pid_t pid = fork() 
    if (pid == 0) { 
     // Handle client command 
     exit(0); 
    } 
    } 
+0

제안에 감사드립니다. 기준의 어느 것이 유닉스 도메인 소켓에 가장 잘 맞는지 알려주십시오. 나는 배우기를 바랍니다. –

+0

소켓은 자동으로 다른 클라이언트 데이터 스트림을 분리합니다. 클라이언트가 연결할 때마다 서버는 새로운 임시 소켓을 만들고 원래 클라이언트 소켓에 새 클라이언트를 사용할 수있게 둡니다. 메시지 대기열을 사용하면 자체 분리를 구현해야합니다. 또한 소켓은 POSIX 표준 read() 및 write() 시스템 호출을 사용하므로 유지 보수자가 더 쉽게 이해할 수 있습니다. –

+0

다니엘 감사합니다. 나는 메시지 대기열이 열릴 때 Linux 메시지 대기열이 파일 설명자를 제공했기 때문에 모든 클라이언트에 대해 새로운 desciptor를 가질 수 있다고 생각했습니다. 그러나 이것이 작동하려면 Windows가 Named Pipes가 본질적으로하는 것처럼 OS가이 분리를 지원해야한다고 생각합니다. Linux 메시지 대기열에서이 문제를 처리하는지 여부는 확실하지 않았습니다. –