Linux C 네트워크 프로그래밍에는 연결된 네트워크 통신을 종료하는 두 가지 방법이 있습니다. 해당 기능의 프로토타입은 다음과 같습니다.
1 #include< 🎜>
2 int close(intsockfd) 3 //반환: 0 - 성공, 1 - 실패 4 #includeclose()를 호출하는 것은 TCP 연결을 닫는 일반적인 방법이지만 이 방법에는 두 가지 제한 사항이 있으며 이것이 shutdown()을 도입하는 이유입니다.
1) close()는 실제로 소켓을 참조합니다. fd 개수는 1씩 감소합니다. 소켓 fd의 참조 개수가 0으로 감소한 경우에만 TCP 전송 계층은 연결을 실제로 종료하기 위해 4방향 핸드셰이크를 시작합니다. Shutdown은 참조 횟수에 제한을 받지 않고 연결을 닫는 데 필요한 4개의 핸드셰이크를 직접 시작할 수 있습니다.2) close()는 TCP 이중 링크를 종료합니다. TCP 연결의 전이중 특성으로 인해 다음과 같은 애플리케이션 시나리오가 있을 수 있습니다. 로컬 피어는 더 이상 원격 피어에 데이터를 보내지 않으며, 이 경우 원격 피어에는 여전히 보낼 데이터가 있을 수 있습니다. 로컬 피어는 원격 피어에게 더 이상 데이터를 보내지 않지만 계속 데이터를 받을 것임을 알리기 위해 close()를 사용할 수 없지만 shutdown()을 사용하여 이 작업을 완료할 수 있습니다.
close 함수와 shutdown 함수의 첫 번째 매개변수는 파일 디스크립터를 나타냅니다. 우리는 Linux 운영 체제에서는 모든 것이 파일로 처리되고 장치 및 메모리와 같은 모든 것이 파일로 시뮬레이션된다는 것을 알고 있습니다. 물론 네트워크 간의 통신도 예외는 아닙니다. 각 통신 세션에는 이에 해당하는 파일 설명자가 있으며, 이들 사이의 작업은 로컬 파일을 작업하는 것과 같습니다. 종료 기능에는 다음 세 가지 값을 갖는 Howto 매개변수도 있습니다.
SHUT_RD: 이 시점에서 사용자는 더 이상 이 소켓에서 데이터를 읽을 수 없습니다. 이 소켓에 의해 수신된 메시지는 폐기되며 피어는 이 프로세스를 인식하지 못합니다. 연결의 읽기 측을 닫습니다. 즉, 소켓은 더 이상 데이터를 허용하지 않으며 현재 소켓의 수신 버퍼에 있는 모든 데이터는 삭제됩니다. 프로세스는 소켓에 대한 읽기 작업을 실행할 수 없습니다. TCP 소켓에서 이 호출 이후에 수신된 모든 데이터는 승인된 후 자동으로 삭제됩니다.
close 함수 사용에는 두 가지 제한 사항이 있지만 shutdown을 사용하면 이러한 제한을 피할 수 있습니다.
close 함수는 설명자의 참조 횟수를 1씩 감소시키며, 해당 횟수가 0이 될 때만 설명자는 실제로 닫힌 인터페이스이며 종료 기능을 사용하면 참조 횟수에 관계없이 TCP의 정상적인 연결 종료 시퀀스를 트리거할 수 있습니다.
닫기 기능은 읽기 및 쓰기 방향 모두에서 데이터 전송을 종료합니다. TCP 연결은 전이중이므로 때로는 데이터 전송이 완료되었음을 피어에게 알려야 하며, 데이터 전송을 위해 채널을 닫으면 되지만 여전히 피어가 보낸 데이터를 수신할 수 있습니다. 이는 종료 기능을 사용하여 달성할 수 있습니다.