2010-01-20 3 views
2

이전에 완료되기 전에 boost :: asio 소켓에 두 번째 쓰기를 시도하면 어떻게 될지 알 수 없다. 이것은 많은 비동기 프로그램에서 잠재적으로 발생할 수있는 것처럼 보입니다. 첫 번째 쓰기를 마친 후에 프로그램이 끝날 때까지 기다렸다가 잠재적으로 두 번째 메시지를 보내는 등의 문제가 발생할 수 있습니다. 나는 일어날 수있는 몇 가지 가능한 일들을 생각해 냈다. (이것은 모든 경우에 메시지가 async_write에 대한 단일 호출로 전송된다고 가정한다.) 심지어 하나의 TCP 패킷 단일 소켓에 boost :: asio를 여러 번 쓰다.

  • 제 async_write 통화 순서 가능한

    • 하는 Asio가 MSG1 다음 MSG2를 보낸다
      void handleWrite(const boost::system::error_code&error) 
      { 
          if(error)throw NetError(error); 
      } 
      
      vodi sendStuff() 
      { 
          const char msg1 = "Red, Green, Blue"; 
          const char msg2 = "One, Two, Three"; 
      
          asio::async_write(socket,asio::buffer(msg1,sizeof(msg1)),boost::bind(&handleWrite,_1)); 
          //assume msg1 has still not been sent by the time we get here 
          asio::async_write(socket,asio::buffer(msg2,sizeof(msg2)),boost::bind(&handleWrite,_1)); 
      } 
      

      그래서 제 송신 에러가 발생하지 않는다고 가정 MSG1까지 블록 결과가 제가 있어 가정

    msg1s 에러가 발생하는 경우를

  • 정의되지
  • 을 수행 예외로 인해 msg2도 중단됩니다.

    관련된 io_service에 스레드 풀이 있거나 단일 스레드 만있는 경우에도 영향을 받습니까?

    안전하지 않은 경우 보낼 메시지 큐를 유지하는 일종의 간단한 래퍼를 작성하고 하나씩 보내고 쓰기 처리기에서 예외를 throw하는 경우 중단합니다.

  • 답변

    1

    정상적인 비 블로킹 소켓을 사용하면 소켓에 구현에 의존하는 양을 쓸 수 있습니다. 그러면 결국 쓰기는 -EWOULDBLOCK을 리턴하고 쓰기를 수행하지 않기 때문에 나중에 다시 시도 할 수 있습니다. 소스에서 파고를하면 Boost가이를 감싸고 있으므로 결국 작성한 모든 내용이 결국 will_block 또는 try_again을 포함하지 않고 오류가 발생해야합니다.

    관련 문제