2017-10-02 1 views
1

부스트 asio를 사용하여 서버를 만들고 있는데 문제가 있습니다. 내 서버가 연결된 여러 클라이언트에서 데이터를 수신하고 특정 클라이언트에게도 명령을 보낼 수 있어야합니다. 부울 asio에서 공유 대기열에 보낼 폴링 명령

... 내가 async_read 등 전화 콜백와 async_write 전화 콜백으로 async_read를 호출하는 연결하는 각각의 클라이언트에 대한 새로운 연결 세션을 인스턴스화하고있어 나는 '문제를 이렇게하려면 m facing는 다음과 같습니다.

보낼 명령을 클릭 할 수있는 서버의 GUI가 있으면 해당 명령이 공유 대기열에 저장됩니다. 대기열이 공유되므로 각 연결 세션은 연결된 클라이언트에 보낼 명령이 있는지 폴링 할 수 있습니다.

문제는 세션에서 "자체 호출 콜백"스키마를 사용하여 성능에 지장을주지 않고 대기열에 명령이 있는지 확인할 수있는 방법입니다. (첫 번째 해결책은 마감 시간 타이머를 설정하는 것입니다. async_write 작업을 통해 각 X 초를 확인할 수 있습니까?)

아이디어가 있으십니까?

답변

0

요점은 프로 액터 기반 이벤트 처리가 큐를 폴링하는 것과 근본적으로 반대라는 것입니다.

보통 대기열을 만들고 쓰기 루프가 (async_ 콜백 스타일을 사용하여) 고갈 될 때까지 예약합니다. 그 예가 여기에 있습니다 : http://www.boost.org/doc/libs/1_65_1/doc/html/boost_asio/example/cpp03/chat/chat_client.cpp (chat_message_queuewrite_in_progress 찾습니다).

기본적으로 이벤트에 이벤트 (즉, "메시지 대기 중")를 삽입하고 비동기 호출 체인이 대기열을 배출하도록합니다. Why do I need strand per connection when using boost::asio?

- 각 메시지에 대한 작업을 대기 이상의 장점은 비동기 호출 체인이

암시 가닥을 ¹ 암시 주문/synchronization¹를 않는다는 것입니다

관련 문제