2017-04-26 1 views
1

다음과 같은 비트의 ASIO 코드가 있습니다.이 비트는 동기식으로 UDP 패킷을 읽습니다. 문제는 특정 크기의 데이터 패킷이 주어진 시간 프레임 (30 초)에 도착하지 않은 경우입니다. recieve_from 함수가 특정 유형의 시간 초과에 대한 오류와 함께 반환되기를 바랍니다.UDP 호출에 타임 아웃 적용 ASIO에서 receive_from을 사용합니다.

for (;;) 
{ 
    boost::array<char, 1000> recv_buf; 
    udp::endpoint remote_endpoint; 
    asio::error_code error; 

    socket.receive_from(asio::buffer(recv_buf), // <-- require timeout 
     remote_endpoint, 0, error); 

    if (error && error != asio::error::message_size) 
    throw asio::system_error(error); 

    std::string message = make_daytime_string(); 

    asio::error_code ignored_error; 
    socket.send_to(asio::buffer(message), 
     remote_endpoint, 0, ignored_error); 
} 

UDP 기반 호출과 관련없는 문서는 타임 아웃 메커니즘을 지원합니다.

ASIO에서 동시성 UDP 호출로 타임 아웃을하는 올바른 방법은 무엇입니까?

+0

분명히 SO_RCVTIMEO와 비슷한 것이 있습니까? – EJP

+1

@EJP 나는 거기에있을 거라 기대했지만 아무 것도 문서에 언급되어 있지 않다. –

+0

놀라운. 'select()'로 합성 할 수 있지만 asio에서는 그렇게한다. – EJP

답변

0

내가 아는 한, 이것은 불가능합니다. 동기 receive_from을 실행하면 시스템 호출 recvmsg에서 코드 실행을 차단했습니다. #include <sys/socket.h>.

휴대에도 있듯이, 나는 Windows 용 말할 수 있지만, 리눅스/BSD의 C-맛 솔루션은 다음과 같이 보일 것이다 : 나는 전체 비동기 실행을가는 것이 좋습니다이 전혀 가능하지 않은 경우

void SignalHandler(int signal) { 
    // do what you need to do, possibly informing about timeout and calling exit() 
} 

... 
struct sigaction signal_action; 
signal_action.sa_flags = 0; 
sigemptyset(&signal_action.sa_mask); 
signal_action.sa_handler = SignalHandler; 
if (sigaction(SIGALRM, &signal_action, NULL) == -1) { 
    // handle error 
} 
... 
int timeout_in_seconds = 5; 
alarm(timeout_in_seconds); 
... 
socket.receive_from(asio::buffer(recv_buf), remote_endpoint, 0, error); 
... 
alarm(0); 

을 그것은 boost::asio::io_service입니다.