2010-12-09 7 views
4

내 서버 응용 프로그램에 부스트 비동기 소켓을 사용하고 있습니다. boost() 함수를 호출하여 boost의 close()를 호출 한 다음 소켓 (연산자 delete)을 삭제합니다. 그리고 비동기 중 하나에서 함수가 호출되면 괜찮습니다. 처리기로 처리하지만, 메인 코드베이스 내부에서 호출하면 전체 애플리케이션이 비동기 처리기 중 하나에서 충돌합니다. 부스트에서 소켓을 멋지게 닫는 방법?Boost :: asio 소켓 - 연결을 끊는 방법?

답변

2

해당 개체를 사용할 수있는 핸들러가 존재하는 한 해당 개체가 살아 있는지 확인하십시오.

그것은 당신이 (그것이 이 핸들러에 오류를보고로) CLOSE 호출 후 죽은 포인터에 액세스 한 후이 소켓이라고 사용하는 핸들러 중 하나 ...

보통, 생활 시간 처리 할 수있는 가능성이 boost::shared_ptrboost::enable_shared_from_this으로 쉽게 처리하고 처리기로 전달하십시오. Boost.Asio와 함께 제공되는 수많은 예제를 참조하십시오.

일단이 기술에 익숙해지면 요청한 질문이 당신에게 사소한 것처럼 보일 것입니다.

+0

원시 포인터는 더 원시입니다. 스마트 포인터는 사용하지 않는 것이 좋습니다. – vladimir

+5

@vladimir, 당신이 뭔가가 더 원초적이라고 생각하기 때문에, 좋은 연습이되지는 않습니다. 스마트 포인터는 그렇지 않으면 ballache가 될 수있는 많은 문제를 해결합니다. –

+1

+1 문장에서 "ballache"를 사용합니다. –

1

소켓의 종료 방법을 조사하고 싶습니다. 그것은 귀하의 충돌 응용 프로그램을 해결하지 않습니다. 위의 Artyom은 이미 그 원인을 설명했지만 그럼에도 불구하고 흥미 롭습니다. shutdown을 호출하지 않고 소켓을 닫으면 gracefull FIN 핸드 셰이크 대신 RST가 전송 될 수 있습니다.

+0

확실하게 오래 끄면 RST 만 표시됩니다. –

관련 문제