2011-12-09 4 views
2

나는 boost :: asio 사용하여 비동기 적으로 읽으려고하는 네이티브 posix 소켓 있습니다 : : async_read. 그러나 이렇게하면 :boost :: asio :: async_read 실패하지만 boost :: asio :: read 작동합니다 (io_stream.run_one() 사용)

// io_stream and fd are passed by reference to this function 
asio::posix::stream_descriptor stream(io_stream); 
stream.assign(fd); 

boost::system::error_code ec; 

asio::async_read(stream, buffer, 
       asio::transfer_at_least(1), 
       boost::bind(doRead, 
          asio::placeholders::error, 
          asio::placeholders::bytes_transferred)); 
size_t count = io_service.run_one(ec); 

카운트 변수는 0으로 설정되고 doRead 처리기는 호출되지 않으며 ec에는 오류가 없습니다. 나는 동기 읽기와 비동기 읽기를 대체 그러나 경우 :

size_t count = asio::read(stream, buffer, 
          asio::transfer_at_least(1)); 

을이 작품과 내가 다시 카운트 변수에 예상 된 양의 데이터를 얻을.

"int pipe (int pipefd [2]);"에 의해 작성된 fd를 사용하는 테스트 케이스

  • 그것이 내가 전달하고 기본 기술자가 어떤 방법으로 async_read와 호환되지 않습니다 방법을 일부하므로 : 및 ASIO :: async_read와 그 잘 작동을 통해 데이터를 전달 그래서 나는 몇 가지 옵션이 될 수있다 생각하고 조용히 실패했다. 나는 아무 쓸모없이 on/off를 막아서 그것을 만들려고 노력했다.
  • io_service와 posix :: stream_descriptor는 어떻게 연결되지 않으므로 io_service는 절대로 읽기를 실행하지 않습니다. 이것이 내가 참조로 io_service를 전달했기 때문일 수 있습니까? (그리고 몇 가지 스레드 내에서 그 문제에 대해서도 마찬가지입니까?)
+0

'stream_descriptor'는'pipe'의 읽기 끝에있는 디스크립터로 잘 동작합니다. [this] (http://stackoverflow.com/questions/5210796/boost-asio-how-to-write- 콘솔 서버/5211349 # 5211349) 대답. 두 번째 총알이 당신이 보는 행동의 원인이라고 생각합니다. 질문을 편집하고 분석 할 수 있도록 [짧고, 독립적 인, 올바른 예] (http://sscce.org/)를 포함하십시오. –

+0

집에서 코드를 갖고 있지 않기 때문에 직장에서 월요일에 함께 할 것입니다. 감사합니다! –

답변

1

문제점을 발견했습니다.

다시 초기화 할 수 있으므로 소유 객체의 초기화 함수에서 io_service.stop()을 호출하고있었습니다. 그러나 io_service.reset()을 호출 한 후 중지하지 않았고 재설정이 호출 될 때까지 io_service가 중지 된 후에 실행되지 않습니다.

정지 및 재설정으로 RTFM의 교훈이 문서화됩니다.

그러나 boost :: system :: error_code 변수는이 상황을 반영하지 못했고 약간의 좌절감을 안겨주었습니다.