문제

나는 최근에 다음과 같은 것처럼 보이는 약간의 코드를 보았습니다 (양말은 물론 소켓 개체입니다).

sock.shutdown(socket.SHUT_RDWR)
sock.close()

소켓에서 셧다운을 호출 한 다음 닫는 목적은 정확히 무엇입니까? 차이가 발생하면이 소켓은 비 차단 IO에 사용됩니다.

도움이 되었습니까?

해결책

여기 하나가 있습니다 설명:

소켓이 더 이상 필요하지 않으면 통화 프로그램은 소켓 디스크립터에 가까운 서브 루틴을 적용하여 소켓을 폐기 할 수 있습니다. 신뢰할 수있는 전달 소켓에 닫기가 발생할 때 데이터와 관련된 데이터가있는 경우 시스템은 계속 데이터 전송을 시도합니다. 그러나 데이터가 아직 배달되지 않은 경우 시스템은 데이터를 폐기합니다. 응용 프로그램 프로그램이 보류중인 데이터를 사용하지 않으면 소켓을 닫기 전에 소켓의 셧다운 서브 루틴을 사용할 수 있습니다.

다른 팁

부름 close 그리고 shutdown 기본 소켓에 두 가지 다른 영향을 미칩니다.

가장 먼저 지적한 것은 소켓이 기본 OS의 자원이라는 것입니다. 여러 프로세스에는 동일한 기본 소켓에 대한 핸들이있을 수 있습니다.

전화 할 때 close 핸들 카운트가 1 씩 감소하고 핸들 카운트가 0에 도달하면 소켓과 관련 연결이 정상적인 닫기 절차 (피어에게 FIN / EOF를 효과적으로 보내기)를 통과하고 소켓이 처리됩니다.

여기서주의를 기울여야 할 것은 다른 프로세스가 여전히 소켓에 대한 핸들이 있기 때문에 핸들 카운트가 0에 도달하지 않으면 연결이 연결되어 있다는 것입니다. 닫히지 않고 소켓이 처리되지 않습니다.

반면에 전화 shutdown 읽기 및 쓰기의 경우 기본 연결을 닫고 소켓에 핸들이 얼마나 많은 프로세스 수에 관계없이 피어에게 FIN / EOF를 보냅니다. 그러나, 그것은 하지 않습니다 소켓을 처리하면 나중에 가까이 호출해야합니다.

종료 및 닫기 설명 : 우아한 셧다운 (MSDN)

셧다운 (귀하의 경우)은 연결의 다른 쪽 끝에 더 이상 소켓에서 읽거나 쓸 의도가 없음을 나타냅니다. 그런 다음 소켓과 관련된 메모리를 닫습니다.

셧다운을 생략하면 연결이 우아하게 닫힐 때까지 OSS 스택에 소켓이 남아있을 수 있습니다.

IMO 이름 '종료'와 'Close'라는 이름은 오해의 소지가 있습니다. 'Close'및 'Destroy'는 그 차이를 강조 할 것입니다.

소켓 프로그래밍 Howto에서 바로 언급되었습니다 (PY2/py3)

연결을 끊습니다

엄밀히 말하면, 당신은 사용해야합니다 shutdown 당신 앞에 소켓에 close 그것. 그만큼 shutdown 다른 쪽 끝에있는 소켓에 대한 자문입니다. 당신이 그것을 전달하는 주장에 따라, 그것은“더 이상 보내지 않겠지 만 여전히들을거야", 또는 "난 듣고 있지 않아, 좋은 멍청이!".". 그러나 대부분의 소켓 라이브러리는 일반적 으로이 에티켓을 사용하는 것을 무시하는 프로그래머에 사용됩니다. close 와 같다 shutdown(); close(). 따라서 대부분의 상황에서는 명시적인 종료가 필요하지 않습니다.

...

이 코드가 잘못되지 않습니까?

종료 호출 직후에 긴밀한 통화는 어쨌든 커널이 모든 발신 버퍼를 버릴 수 있습니다.

에 따르면http://blog.netherlabs.nl/articles/2009/01/18/the-ultimate-so_linger-page-or-why-is-my-tcp--not------셧다운과 닫기 사이를 기다려야합니다.

셧다운의 맛이 있습니다. http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx. *닉스는 비슷합니다.

종료 (1), 소켓이 더 이상 데이터를 보내도록 강제

이것은 유용합니다

1- 버퍼 플러싱

2- 이상한 오류 감지

3- 안전한 보호

더 자세히 설명하겠습니다. A에서 B로 데이터를 보낼 때 B로 전송되는 것이 보장되지 않으며 A OS 버퍼로 전송되는 것이 보장됩니다.

따라서 A에서 종료 (1)를 호출하면 A의 버퍼를 플러시하고 버퍼가 비어 있지 않으면 오류가 발생합니다. 즉, 데이터는 아직 피어에게 전송되지 않았습니다.

Howo this this this his byleverse는 모든 데이터를 완전히 보냈고 Peer OS 버퍼의 적어도 있는지 확인하고 싶습니다.

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