부 ASIO 쓰는 걸어 장치의 연결을 끊

0

질문

나는 서버 응용 프로그램을 사용하는 향상 ASIO 과 통신하는 여러 클라이언트입니다. 서버 응용 프로그램이 실행되는 리눅스 시스템에서 서버와 클라이언트에서 실행 Windows 데스크톱.

현재 디자인 멀티 스레드가 있지만 하나만을 향상 ASIO thead(실행 boost::asio::io_context). Boost ASIO 스레드에 대해서만 책임이 읽기,쓰기,그리고 일부는 자주합니다. 읽기를 사용하여 수행됩 boost::asio::async_read 하지만 복사 결과 메시지는 또 다른 스레드에 할 수 있는 작업의 처리합니다. 쓰을 사용하여 수행됩 boost::asio::write 그러나 메시지를 이미 복사하고 전달하 ASIO 스레드

대부분의 상황에서 클라이언트의 연결을 끊을 향상 ASIO 오류가 발생,내가 종료 관련 소켓과 다른 소켓 작업을 유지합니다. 그러나 클라이언트의 Windows 데스크톱에는 정전이있는 동안 boost::asio::write 쓰고 그들에게 다음을 향상하지 않는 검색결과에 달려 boost::asio::write. 그것이 중단을 위해 거의 20 분간 때때로 서버와 통신할 수 없으로 다른 클라이언트는 이 시간 동안

에서 내가 온라인으로 읽는 저자의 부스트 ASIO 의도를 소개하는 시간 제한 매개 변수입니다. I tried 설정 SO_SNDTIMEO5 초간만 있지 않은 어떤 영향을 미치에서 쓰는 걸어. 으로 지금 나의 추측하고 문제를 해결하는 모든 소켓과 다른 스레드는 하나의 클라이언트가 걸릴 수 없습니다 아래 다른 클라이언트입니다. 은 없는 것 보다 더 나은 옵션을 이? 내가 할 경우 모든 소켓의 자신의 스레드를 뜻이 나는 것입니다 필요 boost::asio::io_context 스레드당을 방지하 쓰는 걸?

편집:후을 보고 의견을 내가 다시 시도 함수를 호출하는 boost::asio::writeboost::asio::async_write. 아래에 나는 단순한 하지만 아직도 무엇을 보여주의 전반적인 변화되었:

원래와 boost::asio::write:

inline void MessagingServer::writeMessage(
    GuiSession* const  a_guiSession,
    const PB::Message& a_msg
) {
    boost::asio::dispatch(m_guiIoIoContext, [this, a_guiSession, a_msg]() {
        // I removed code that writes a_msg's bytes into m_guiIoWriteBuf
        // and sets totalSize to simplify for SO

        boost::system::error_code error;
        boost::asio::write(a_guiSession->m_guiIoGsSocket, boost::asio::buffer(m_guiIoWriteBuf, totalSize), error);
        if (UNLIKELY(error))
            ERRLOG << a_guiSession->m_gsSessionId << " write failed: " << error.message();
    });
}

으로 다시 실행 boost::asio::async_write:

inline void MessagingServer::writeMessage(
    GuiSession* const  a_guiSession,
    const PB::Message& a_msg
) {
    a_guiSession->m_tempMutex.lock();

    boost::asio::dispatch(m_guiIoIoContext, [this, a_guiSession, a_msg]() {
        // I removed code that writes a_msg's bytes into m_guiIoWriteBuf
        // and sets totalSize to simplify for SO

        boost::asio::async_write(
            a_guiSession->m_guiIoGsSocket,
            boost::asio::buffer(m_guiIoWriteBuf, totalSize),
            [this, a_guiSession](const boost::system::error_code& a_error, std::size_t) {
                if (UNLIKELY(a_error))
                    ERRLOG << a_guiSession->m_gsSessionId << " write failed: " << a_error.message();

                a_guiSession->m_tempMutex.unlock();
            }
        );
    });
}

잠금을 도입되었에서 두 번째 코드를 보장하는 단 하나의 전화 boost::asio::async_write 활동적이었서(내가 알고 있다는 것은 더 성능이 뛰어가지 방법이지만 이에 대한 간단한 시험). 모두의 이러한 코드가 동일한 문제에 매달려의 부스트 ASIO 경우 클라이언트는 힘이 실패입니다. 그러나 그들이 하는 걸어 다른 방법으로는,비동시성 코드가 허용한 향상 ASIO 다른 작업을 수행하지만,추가로 기록할 때까지 매달려 하나는 생산 오류

시 별도의 실험을 했 설정하십시오 SO_KEEPALIVE 그러나 그것은 또한 해결되지 않은 걸 문제

asio boost c++ multithreading
2021-11-22 19:46:12
1

최고의 응답

1

가 동의 의견 제시하는 이 방법 TCP 일반적으로 작동합니다.

참고할 수 있는 소개하는 시간 제한을 사용하여 ASIO 타이머입을 취소할 수 있습 aynchronous 작업에서 소켓이 있습니다.

많은 많은 예제를 검색하는 경우

  • 부스트::asio::steady_timer,oost::asio::high_resolution_timer 와 유사한 구성원의 std::크로노 가족의 시계
  • 부스트::deadline_timer
2021-11-22 22:29:35

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................