2013-11-14 5 views
0

윈도우 서버 소켓과 리눅스 클라이언트 소켓이 있습니다. 클라이언트가 서버에 연결하여 메시지를 보냅니다. 그 후에, 서버는 외부 실행 파일을 호출합니다. 문제는 서버를 사용할 수없는 경우 클라이언트가 연결 기능에서 시간 초과로 차단 중입니다.하지만 원하지 않습니다. 연결이되지 않으면 클라이언트 소켓이 곧바로 닫히기를 바랍니다.C++ 타이머없이 boost :: asio 연결 소켓을 만들 수 있습니까?

누군가 나에게 조언을 해줄 수 있습니까?

+1

몇 가지 샘플 코드를 게시 할 수 있습니까? – patchwork

+0

socket.connect (Iterator iterator) 서버가 다운되면 클라이언트가이 stat에서 일부 제한 시간으로 차단됩니다. 이 시간 초과를 제거하거나 0으로 설정하려고합니다. – jean

답변

1

경고 : 의사 코드가 앞에 있습니다.

그렇게 할 수 있습니다. 그러나 그것은 당신이 희망하는 것처럼 곧장 나아지지 않습니다. 차단하지 않으려면 클라이언트의 async_connect()을 사용해야합니다. 그런 다음 적절한 시간 초과로 설정 한 deadline_timer이 필요합니다. 0은 작동하지 않으므로 async_connect()에게 시간을 주어야합니다. 그러나 나는 1 초나 2 초가 잘되어야한다고 생각한다.

그러면 타이머 처리기는 소켓에서 모든 비동기 작업 (cancel())을 수행해야합니다 (연결 만 필요한지 확인해야하며 필요하면 더 많은 소켓을 사용해야합니다).

소켓이 그것에 의해 닫히지 않도록주의하십시오. 전달 된 error_code가 부정적인 결과를 나타낼 때마다 async_connect의 핸들러에서 닫는 것이 이상적입니다. 예를 들어 취소 된 경우 OPERATION_ABORTED를 error_code로 호출하여 핸들러가 호출됩니다.

물론 확인 만하면 cancel() 뒤에 타이머 처리기의 소켓이 close() 개일 수 있습니다. 그러나 그것은 다른 이유로 인해 async_connect이 실패 할 때마다 열린 소켓으로 당신을 떠날 것입니다.

async_connect() 오류 코드가 성공하지만 성공할 때마다 소켓을 닫으려고한다고 가정합니다. 그리고 boolean으로 사용될 때 SUCCESS가 암시 적으로 0으로 변환 된 유일한 error_code이므로 처리기에서 확인하는 것이 쉽습니다.^

async_connect() 처리기에서 deadline_timer을 취소하고 소켓을 닫기 전에 타이머 처리기가 OPERATION_ABORTED와 함께 호출되지 않았는지 확인하십시오. ^^