2012-11-27 3 views
1

나는 boost :: asio를 사용하여 네트워크 프로그래밍을 구현하고 타이밍 문제로 실행합니다. 현재이 문제는 대부분 클라이언트에게 있습니다.부스트 ASIO 네트워크 타이밍 문제

프로토콜은 서버가 사용자에게 날짜 시간 문자열을 반환함으로써 시작되며 클라이언트는이를 읽습니다. 그 부분까지 잘 작동합니다. 하지만 내가 원하는 것도 명령을 서버에 쓰고 서버에 명령을 쓸 수있게하는 것입니다. 이 작업을 수행하기 위해 아래와 같이 io_service.post() 함수를 사용합니다.

io_service.post(boost::bind()); // bounded function calls async_write() method. 

어떤 이유로 소켓이 아직 작성되지 않은 초기 클라이언트/서버 통신 전에 쓰기 시도가 발생합니다. 그리고 나 나쁜 소켓 설명자 오류가 발생합니다.

이제 실제로 io_service의 run 메소드가 다른 스레드에서 호출됩니다.

메서드를 게시하기 전에 sleep (2) 명령을 사용하면 정상적으로 작동합니다.

게시 된 호출이 실행되기 전에 소켓이 만들어 지도록 동기화하는 방법이 있습니까?

+4

가 왜 읽기의 완료 핸들러에서'async_write' 전화, 또는 "초기 클라이언트/서버 통신"후에 호출되는 모든 함수에서 수행하지 않는 ? asio 예제를 살펴보십시오. –

+0

왜 downvote?. 내 질문은 간단합니다. 실제 소켓 인스턴스가 설정되기 전에 게시 명령을 실행하면 어떻게됩니까? – Anonymous

답변

1

을 줄 것이라고 생각 완료되었거나 실패했습니다. 따라서 성공 콜백에서 "게시 된 통화"를 트리거해야합니다.

관련 메소드와 클래스는 다음과 같습니다

boost::asio::ip::tcp::resolver::async_resolve(...) 
boost::asio::ip::tcp::socket::async_connect(...) 
+0

또 다른 해결책은 바인딩 된 함수와 소켓 생성 함수를 같은 [strand]에 게시하는 것입니다 (http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/reference/io_service__strand.html).), 소켓 생성 함수가 먼저 호출되면, 'strand'는 두 번째 함수가 실행되기 전에 끝날 것입니다. –