send()
직후에 close()
소켓에 현명한/안전합니까?send() : close() 안전하지 않은 close() 소켓?
나는 TCP가 소켓을 닫은 후에도 송신 버퍼에 남아있는 모든 데이터를 전달하려고 시도한다는 것을 알고 있지만 실제로 그렇게 할 수 있습니까?
수신 버퍼에 남아있는 데이터가 없으므로 폐쇄 후 RST가 전송되지 않도록해야합니다. 내 경우
는 가까운 실제로 exit()
를 호출하기 전에 코드의 맨 마지막 문입니다.
TCP 스택이 전송 프로세스가 종료 된 후에도 실제로 데이터를 계속 전송하려고합니까? SO_LINGER를 설정하여 close()
을 호출하기 전에 임의의 시간 초과를 기다리는 것만큼이나 신뢰할 만합니까?
즉, 동일한 TCP 타임 아웃이 적용됩니까? 아니면 더 짧습니까? 큰 보내기 버퍼와 느린 연결을 사용하면 버퍼링 된 모든 데이터를 실제로 전송할 시간이 상당히 길어질 수 있습니다.
마지막으로 보낸 바이트를 알리는 데 전혀 관심이 없습니다. 나는 단지 원격 호스트에 가능한 한 안정적으로 도달하도록하고 싶습니다.
응용 프로그램 계층 확인은 옵션이 아닙니다 (프로토콜은 HTTP이고 작은 서버를 작성합니다).
구현에 따라 다르지만 일반적으로 예 ('close()'는 실제로 소켓을 뜯어 내기 전에 버퍼에 남아있는 데이터를 플러시합니다. close()를 호출하는 것 외에도 전체 프로세스를 종료하면 마일리지가 달라질 수 있습니다. – aroth
@aroth 마일리지는 귀하가 절차를 종료하면 변경되지 않습니다. 두 가지 경우에는 차이가 없습니다. 반대를 유지하려면 신뢰할 수있는 참조를 제공하십시오. – EJP
@EJP - 임의의 프로그램에서 * 발생할 수있는 권위있는 참조? 나는 그런 것이 존재한다고 생각하지 않는다. 그러나 그럴듯한 예를 제시하는 것은 간단합니다. 대부분의 프로그램처럼 별도의 스레드에 모든 네트워크 작업을 위임하는 프로그램이 있다고 가정 해보십시오. 백그라운드 스레드가'close()'를 호출하는 동안 주 스레드가 (정상적으로 또는 다른 방법으로) 프로세스를 종료 할 수 있습니다. 이 경우 통화가 성공할 것인가? 나는 그것을 의심한다. 허락하신다면, 당신이 말하는 것은 단일 스레드 프로그램에 적용되어야합니다. 그러나 모든 프로그램이 단일 스레드 인 것은 아닙니다. – aroth