2017-09-23 7 views
0

먼저 Boost asio에서 새로운 것을 말하고 싶습니다. 많은 예제가 있지만 이해할 수없는 부분이 있습니다.부스트 asio - 동기 쓰기/읽기 - 어떻게?

두 개의 클라이언트를 사용할 서버를 만들고 싶습니다 (두 개의 소켓을 사용합니다). 첫 번째 클라이언트는 서버에 메시지를 보내고 서버는이 메시지를 다른 클라이언트에게 보냅니다 (예, 서버를 사용하는 것은 쓸모가 없지만 여기서 중요한 것은 아닙니다.이 모든 것이 어떻게 작동하는지 알고 싶습니다). 이는 클라이언트가 닫힐 때까지 발생합니다.

그래서 서버를 만들었고 서버는 클라이언트를 기다렸다가 첫 번째 클라이언트가 메시지를 보낼 때까지 기다려야합니다. 그리고 이것이 나의 질문입니다. 나는 무엇을해야합니까?

첫 번째 소켓을 읽고 나서 두 번째 소켓에 써야한다고 생각했는데 소켓에 첫 번째 클라이언트가 불만을 제기하는 경우 어떻게 알 수 있습니까? 동일하게, 두 번째 클라이언트가 두 번째 소켓을 읽는 지 어떻게 알 수 있습니까?

코드가 필요하지 않습니다. 단지이를 수행하는 좋은 방법을 알고 싶습니다.

읽어 주셔서 감사합니다.

답변

0

async_read을 수행 할 때 데이터를 버퍼에 읽을 때마다 호출 될 콜백을 지정합니다 (버퍼도 제공해야하며 async_read의 설명서를 확인하십시오). 각각의 데이터가 이미 전송 된 시점을 알기 위해 async_write에 대한 콜백을 제공해야합니다. 따라서 서버 관점에서 '쓰기'하는 클라이언트에 대해 async_read를 수행하고 '읽는'두 번째 클라이언트에 대해서는 비동기 쓰기를 수행해야합니다. 제공된 dataflow client1 -> server -> client2를 사용하면 서버가 어떤 클라이언트에서 읽어야하는지, 어떤 클라이언트가 쓰는지를 인식하기가 어렵습니다. 그것은 당신에게 달려 있습니다. 예를 들어, 연결된 최초 클라이언트를 작성자로, 두 번째 클라이언트를 독자로 선택할 수 있습니다.

asio iostreams로 시작하는 것이 좋습니다. 비동기 소켓보다 높은 수준의 iostream과 유사한 추상화입니다.

P .: 또한 어딘가에 io_service.run() 루프를 실행하는 것을 잊지 마십시오. 모든 asio 콜백은 해당 루프 내에서 실행되기 때문입니다.

+0

알겠습니다. 이해합니다. 하지만 제 경우에는 서버가 클라이언트를 기다리고 나서 뭔가를 받으면 다른 클라이언트에게 보낼 수 있기 때문에 동기 읽기/쓰기를 할 수 있습니까? –

+0

블로킹 asio :: read/asio :: write 함수도 사용할 수 있지만 버클리 소켓과 비교할 때 많은 기능을 추가하지는 않으므로 블로킹 IO에 asio를 사용하는 것은 좋지 않을 것이라고 생각합니다. 대신이 경우에는 전통적인 버클리 소켓을 사용합니다. –

+0

감사합니다. 대단히 감사합니다! –