programing

socket.socket vs.socket.close

testmans 2023. 7. 19. 21:14
반응형

socket.socket vs.socket.close

저는 최근에 다음과 같은 코드를 보았습니다(물론 양말은 소켓 객체입니다).

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

소켓의 종료를 호출한 다음 종료하는 목적이 정확히 무엇입니까?차이가 있다면, 이 소켓은 비차단 IO에 사용되고 있습니다.

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

먼저 소켓은 기본 OS의 리소스이며 여러 프로세스가 동일한 기본 소켓에 대한 핸들을 가질있습니다.

에 전화할 때.close핸들 카운트를 1씩 줄이고 핸들 카운트가 0에 도달하면 소켓과 관련 연결이 정상적인 닫기 절차를 거치게 되며(효과적으로 FIN/EOF를 피어로 전송) 소켓의 할당이 해제됩니다.

여기서 주의해야 할 점은 다른 프로세스가 소켓에 대한 핸들을 여전히 가지고 있기 때문에 핸들 카운트가 0에 도달하지 않으면 연결이 닫히지 않고 소켓의 할당이 해제되지 않습니다.

다른 한편으로는 전화를 합니다.shutdown읽기 및 쓰기는 소켓에 대한 핸들 수에 관계없이 기본 연결을 닫고 FIN/EOF를 피어로 보냅니다.그러나 소켓의 할당이 해제되지 않으므로 나중에 닫기를 호출해야 합니다.

여기 한 가지 설명이 있습니다.

소켓이 더 이상 필요하지 않으면 호출 프로그램은 소켓 설명자에 근접 서브루틴을 적용하여 소켓을 폐기할 수 있습니다.신뢰할 수 있는 전송 소켓에 종료 시 연결된 데이터가 있는 경우 시스템은 데이터 전송을 계속 시도합니다.그러나 데이터가 여전히 전송되지 않으면 시스템은 데이터를 삭제합니다.응용 프로그램이 보류 중인 데이터를 사용하지 않는 경우 소켓을 닫기 전에 소켓의 종료 서브루틴을 사용할 수 있습니다.

종료 및 종료에 대한 설명:정상 종료(msdn)

종료(사용자의 경우)는 연결의 다른 쪽 끝에 소켓에서 읽거나 쓸 의도가 없음을 나타냅니다.그런 다음 닫기는 소켓과 연결된 메모리를 모두 비웁니다.

종료를 생략하면 연결이 정상적으로 종료될 때까지 소켓이 OS 스택에 남아 있을 수 있습니다.

IMO의 '셧다운'과 '닫힘'은 오해의 소지가 있으며, '닫힘'과 '파괴'는 서로의 차이를 강조합니다.

소켓 프로그래밍 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-reliable 따르면 읽기가 0을 반환할 때까지 종료와 종료 사이에 기다려야 합니다.

셧다운에는 몇 가지 맛이 있습니다: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.shutdown.aspx . *nix도 유사합니다.

종료(1), 소켓 no가 더 이상 데이터를 전송하지 않도록 합니다.

이 기능은 에서 유용합니다.

1 - 버퍼 플러싱

2 - 이상한 오류 감지

3 - 안전 보호

A에서 B로 데이터를 보낼 때 B로 전송되는 것은 보장되지 않습니다. Aos 버퍼로만 전송되는 것이 보장됩니다. 그러면 Bos 버퍼로 전송됩니다.

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

그러나 이것은 복구할 수 없으므로 모든 데이터를 완전히 보낸 후에 복구할 수 있으며 적어도 피어 운영 체제 버퍼에 있는지 확인해야 합니다.

언급URL : https://stackoverflow.com/questions/409783/socket-shutdown-vs-socket-close

반응형