>  기사  >  php教程  >  Linux 네트워크 프로그래밍--shut_down과 close() 함수의 차이점

Linux 네트워크 프로그래밍--shut_down과 close() 함수의 차이점

高洛峰
高洛峰원래의
2016-12-13 15:46:071905검색

Linux C 네트워크 프로그래밍에는 연결된 네트워크 통신을 종료하는 두 가지 방법이 있습니다. 해당 기능의 프로토타입은 다음과 같습니다.

1 #include< 🎜>

2 int close(intsockfd)

3 //반환: 0 - 성공, 1 - 실패

4 #include >6 int shutdown(intsockfd,inthowto)

7 //반환: 0 - 성공, 1 - 실패

예 close()를 호출하는 TCP 소켓의 기본 동작은 소켓을 표시하는 것입니다. 닫힌 상태로 즉시 API를 호출하는 프로세스로 돌아갑니다. 이때 애플리케이션 계층의 관점에서 볼 때 소켓 fd는 더 이상 프로세스에서 사용할 수 없습니다. 즉, 더 이상 읽기 또는 쓰기를 위한 매개 변수로 사용할 수 없습니다. 전송 계층의 관점에서 볼 때 TCP는 현재 전송 버퍼에 축적된 데이터를 링크로 전송하려고 시도한 다음 TCP의 4파동을 시작하여 TCP 연결을 완전히 닫습니다.

close()를 호출하는 것은 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 소켓에서 이 호출 이후에 수신된 모든 데이터는 승인된 후 자동으로 삭제됩니다.

SHUT_WR: 이에 따라 쓰기 절반을 닫습니다. 이때 사용자는 더 이상 소켓에 데이터를 쓸 수 없으며 이후에는 더 이상 데이터가 전송되지 않습니다. 이것을 알게 될 것입니다. 피어가 읽기를 시도하면 오류가 발생할 수 있습니다.

SHUT_RDWR: 읽기 및 쓰기 절반을 끕니다. 이때 사용자는 소켓에서 읽거나 쓸 수 없습니다. SHUT_RD를 한 번, SHUT_WR을 한 번 지정하여 종료 함수를 다시 호출하는 것과 같습니다.

SHUT_**는 함수 라이브러리의 매크로로 정의됩니다. shutdown은 두 번째 매크로를 제공하므로 닫기 기능에서는 불가능한 소켓 설명자의 닫기를 정확하게 제어할 수 있습니다. 다중 스레드 환경에서 설명자는 여러 스레드에 의해 복사될 수 있으며 커널은 파일 참조 카운트를 유지 관리합니다. 닫기는 참조 카운트가 0인 경우에만 파일 설명자를 닫을 수 있습니다.

close 함수 사용에는 두 가지 제한 사항이 있지만 shutdown을 사용하면 이러한 제한을 피할 수 있습니다.

close 함수는 설명자의 참조 횟수를 1씩 감소시키며, 해당 횟수가 0이 될 때만 설명자는 실제로 닫힌 인터페이스이며 종료 기능을 사용하면 참조 횟수에 관계없이 TCP의 정상적인 연결 종료 시퀀스를 트리거할 수 있습니다.

닫기 기능은 읽기 및 쓰기 방향 모두에서 데이터 전송을 종료합니다. TCP 연결은 전이중이므로 때로는 데이터 전송이 완료되었음을 피어에게 알려야 하며, 데이터 전송을 위해 채널을 닫으면 되지만 여전히 피어가 보낸 데이터를 수신할 수 있습니다. 이는 종료 기능을 사용하여 달성할 수 있습니다.

1>. 소켓을 공유하는 여러 프로세스가 있는 경우 close가 호출될 때마다 개수는 0이 될 때까지 1씩 감소합니다. 즉, 사용된 모든 프로세스가 close를 호출하고 소켓은 출시됩니다.

2>. 다중 프로세스에서는 하나의 프로세스가 종료(sfd, SHUT_RDWR)되면 다른 프로세스는 통신할 수 없습니다. 프로세스가 종료되면(sfd) 다른 프로세스에 영향을 주지 않습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:리눅스 명령: 종료다음 기사:리눅스 명령: 종료