2012-01-01 4 views
0

나는 로컬 직렬 포트를 여러 네트워크 연결 클라이언트에 연결하는 서버 응용 프로그램을 작성 중입니다. 나는 프로그램을위한 장비가 제한된 메모리를 가진 라우터이기 때문에 서버 애플리케이션을 위해 리눅스와 C를 사용하고있다.동일한 정보를 여러 스레드/소켓으로 보냅니 까?

여러 클라이언트가 각 연결에 대해 fork() 프로세스를 사용하여 직렬 포트에 데이터를 연결하고 전송하도록 모든 설정을했습니다.

내 문제는 직렬 포트에서 들어오는 데이터를 다수의 클라이언트 연결로 보내는 것입니다. 내 문제는 각 활성 소켓에 들어오는 모든 데이터를 얻는 방법을 디자인하고 한 번만 가져 오는 것입니다. 어떤 도움이 필요합니까?

+0

여러 개의 네트워크 클라이언트가 하나의 공통 직렬 인터페이스를 읽고 쓰고 있다고 하시겠습니까? 그것은 그것이 들리는 것 그러나 그것도 이상한 패턴입니다. – purpleamy

+0

그게 전부입니다. 그것이 이상한 im wasnt 한 경우라면 그것은 쉬울 것이다. 안타깝게도 시리얼 인 네트워크 아웃은 중요한 방향입니다. 다른 방향은 각 스레드가 필요에 따라 직렬 포트에 직접 쓰면 더 쉬웠습니다. – scoutjoe

+0

귀하의 디자인이나 요구 사항이 옳은 것인지 확신하지 못합니다. 직렬 포트에 매우주의해야합니다. 여러 스레드 대신'poll'이나'select'와 같은 멀티플렉싱 시스템 콜을 사용할 수 있습니다. –

답변

0

아마도 연결된 클라이언트의 /에 대한 목록이나 다른 참조를 유지할 것입니다. 정보의 각 비트에 대해 반복해서 모든 정보를 보내지 않는 이유는 무엇입니까?

+0

덕분에, 접근 방식은 현재 노력하고있어, 나는 "내장 파이프 또는 비슷한"일을하기를 바라고 있었고, 많은 수의 루프가 실행되고있다. – scoutjoe

1

연결된 각 클라이언트에 대해 데이터 대기열 (버퍼)이 필요한 것 같습니다. 포트에 데이터가 입력 될 때마다 각 클라이언트의 대기열에 데이터를 게시합니다. 그런 다음 클라이언트는 해당 대기열의 전면에서 데이터를 읽습니다. 모든 클라이언트는 아마 다른 요율/시간으로 읽을 것이기 때문에 모든 데이터가 한 번만 사본을 얻을 수 있으며 더 많은 데이터가 들어올 때 한 클라이언트를 기다리지 않아도됩니다. 물론, 연결된 클라이언트의 각 큐에 대해 일정량의 메모리를 할당해야합니다 (예상 클라이언트 수는 확실하지 않고 사용 가능한 메모리가 제한되어 있다고 말했을 때). 클라이언트가 모든 큐를 읽기 전에 큐가 가득 차게됩니다.

0

소켓 디자인 당 스레드가이 문제를 해결하는 가장 좋은 방법이 아닐 수도 있습니다. 이벤트 기반 비동기 접근 방식은 훨씬 더 적합해야합니다. 그러나 스레드로 수행해야하고 직렬 포트가 느린 경우 직렬 포트를 수신하는 스레드와 네트워크 클라이언트와 통신하는 모든 스레드간에 파이프를 만드는 것이 가장 실용적입니다. rwlocks를 사용하여 데이터를 옮길 수는 있지만 여전히 네트워크 스레드가 소켓과 직렬 포트의 데이터를 모두 기다릴 수있는 방법이 필요하므로 두 가지 모두에 대해 파일 설명자를 사용해야합니다. 투표.

심각하지만이 방법은 스레드가 없으면 더 쉽게 수행 할 수 있습니다. 네트워크 및 직렬 포트를보고있는 폴링을 대기하고 어떤 이벤트가 발생했는지 결정한 다음 그에 따라 데이터를 배포하는 메인 루프로 생각하십시오. 일단 아이디어를 얻으면 주위가 쉬워야합니다.

+0

그냥 다시 읽고 환경을 지정하면 표준 POSIX 기능을 사용할 수 없으므로 파이프가 옵션이 아닐 수도 있습니다. 대안은 네트워크 소켓에서 읽기 대기를 방해하는 신호입니다. 그러나 비교적 안전한 가정이어야하는 어떤 형태의 설문 조사가 있다고 가정 할 때, 나는 그들이 추가 한 것을 보지 못해서 스레드를 완전히 포기하려고 시도 할 것입니다. – purpleamy

+0

감사합니다. 이 유형의 서버 프로그래밍은 나에게 새로운 것이므로 내 방식대로 크롤링하려고 시도하고 스레드/포크가 여러 연결을 처리하는 첫 번째 방법이었습니다. 나는이 다른 접근 방식에 대해 머리를 쓰려고 노력하고 있습니다. 대신 fork() 'ing 대신 배열의 시간에 새 소켓의 fd를 추가 한 다음 다시 배열의 각 구성원을 처리합니다 (읽기/쓰기) ?? – scoutjoe

+0

연결 배열이 필요하며 폴 인터페이스를 이해해야합니다. 일단 이벤트 루프를 사용하면 제공되는 FD (들)을 테스트하고 이벤트를 처리하기 위해 제공된 함수를 사용해야합니다 (이벤트를 처리하는 논리를 작성하는 방법은 해당 기능을 사용하는 방법을 파악하는 것입니다). 처리기) 중 네 가지가 있다고 생각합니다. 즉, 연결, 연결 해제, 직렬로부터 수신 및 네트워크 클라이언트로부터 수신. – purpleamy

관련 문제