부스트 :: asio :: ip :: udp :: 소켓을 어떻게 찢어 야합니까?

StackOverflow https://stackoverflow.com/questions/1222637

  •  10-07-2019
  •  | 
  •  

문제

Boost Asio Reference를 읽고 튜토리얼을 살펴보고 몇 가지 예를 살펴 보았습니다. 그래도 소켓이 어떻게 찢어 야하는지 알 수 없습니다.

  1. close ()에게 전화해야합니까?
  2. shutdown () 언제 전화해야하나요
  3. 종료 ()의 효과는 무엇입니까? 나는 그것이 "보내거나받는 것을 비활성화"한다는 것을 알고 있지만 어떻게 이루어 집니까? 소켓이 비활성화 된 후 소켓을 사용하여 보내거나 받으면 무엇을 기대할 수 있습니까?
  4. close ()에서 어떤 오류를 기대할 수 있는지
도움이 되었습니까?

해결책

이것은 다중 질문이므로, 나는 당신의 만족도에 각 부분에 대답하기 위해 최선을 다할 것입니다.

1) 소켓이 소켓을 닫는 것은 ASIO 소켓에 대한 나의 경험이었습니다. 그러나 TCP 소켓 만 다루었습니다. 이것을 확인하는 가장 좋은 방법은 파괴자가 가까운 곳과 비슷한 일을하는지 확인하기 위해 소멸자의 코드를 간단히 살펴 보는 것입니다. Boost 코드는 걸어 가기가 약간 까다로울 수 있으므로 UDP 소켓을 열고 파괴하는 작은 샘플 프로그램을 만드는 것이 가장 쉬울 수 있습니다. 그렇게하면 디버거의 코드를 통해 논리를 따를 수 있습니다.

Boost의 디자이너는 TCP 소켓을 고려하여 이것을 가져 왔기 때문에 UDP 소켓에 대해서도 똑같이하지 않을 것이라고 생각하는 데 어려움을 겪고 있습니다.

2) 전화 shutdown() 코드가 미래를 수행하는 것을 방지 할 필요가 있다고 생각할 때만 recv 및/또는 send 소켓에. TCP 소켓에서 소켓이 RST 폐쇄 된 경우 (기본 "Graceful"셧다운과는 달리 보류중인 Send가 처리되는 경우).

3) 소켓을 2 채널의 커뮤니케이션 형태라고 생각할 수 있습니다. 하나는 읽기를위한 것입니다. 하나를 다른 하나와 독립적으로 종료 할 수 있으며, 다른 채널이 종료 될 때 한 채널을 계속 사용할 수 있습니다 (즉, Send를 위해 종료 한 후에도 여전히 수신 할 수 있습니다). 소켓을 닫는 것은 RECV와 Send의 셧다운을 호출하는 것과 동일합니다.

RECV를 종료하면 단순히 코드가 더 많은 데이터를 읽지 못하게합니다. 그렇게하려고하면 소켓 오류가 발생합니다. 마찬가지로, 연결의 다른 쪽이 데이터를 보내려고 시도하면 오류가 발생합니다 (TCP 세계로 다시 전환하는 것은 죄송하지만 RST 발신자에게 답장을받습니다).

마찬가지로 Send를 종료하면 코드가 더 이상 데이터를 보내지 못하게됩니다. 메모리가 올바르게 제공되면 소켓을 닫을 때 발생하는 일과 동일하게 보입니다 (특정 채널이 종료되었음을 다른 쪽을 신호하기 위해 제로 길이 패킷이 전송됩니다). 앞으로 보내려고 시도하면 오류가 반환됩니다.

4) 확실히 알아 보려면 문서를 확인해야합니다. MSDN 나는 당신에게 꽤 좋은 징후를 줄 것입니다. 그러나 나는 그것이 권위가 있다고 생각한다는 것을 모르겠습니다.

다른 팁

Boost 웹 사이트에 제공된 예제에서 간단히 Close ()를 사용해야하는 것처럼 보입니다. 예를 들어, 이것을보십시오.

void connection::stop()
{
  socket_.close();
}

이 주소에서 가져온 : HTTP 서버

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top