현재 위치: > 최신 기사 목록> PHP에서 Socket_shutdown을 올바르게 사용하여 소켓 연결을 우아하게 닫는 방법은 무엇입니까?

PHP에서 Socket_shutdown을 올바르게 사용하여 소켓 연결을 우아하게 닫는 방법은 무엇입니까?

M66 2025-06-30

PHP에서 소켓은 네트워크 통신을위한 메커니즘으로 클라이언트와 서버간에 연결이 설정됩니다. 소켓을 사용하여 TCP/IP 연결을 처리 할 때는 종종 연결 종료를 제어해야합니다. Socket_shutdown () 은 PHP에서 제공된 기능으로, 확립 된 소켓 연결을 우아하게 닫고, 완전한 데이터 전송을 보장하며, 비정상적인 연결 폐쇄로 인한 자원 폐기물을 피하십시오.

이 기사는 Socket_shutdown ()을 올바르게 사용하여 소켓 연결을 우아하게 닫아 부적절한 폐쇄 방법으로 인한 잠재적 문제를 피하는 방법을 자세히 살펴 봅니다.

1. 소켓 연결의 기본 프로세스

소켓을 사용하여 PHP에서 통신 할 때 일반적으로 다음 단계를 살펴 봅니다.

  • Socket 만들기 : Socket_create ()를 통해 Socket 자원을 만듭니다.

  • 바운드 소켓 : Socket_bind ()를 통해 IP와 포트 번호를 소켓에 바인딩합니다.

  • 연결을 듣습니다 : socket_listen ()을 사용하여 청취를 시작하고 클라이언트가 연결을 시작할 때까지 기다립니다.

  • 연결 수락 : socket_accept () 를 통해 클라이언트의 연결 요청을 수락하십시오.

  • 데이터 읽기/쓰기 : Socket_read ()Socket_write ()를 사용하여 데이터를 전송합니다.

  • 닫기 소켓 : 통신이 완료되면 소켓 연결을 닫으려면 socket_close ()를 호출하십시오.

이 과정에서 연결을 우아하게 닫을 필요가있을 때 Socket_shutdown ()을 사용하여 연결 종료가 전송되는 데이터에 영향을 미치지 않도록 할 수 있습니다.

2. socket_shutdown () 함수의 기본 사용

socket_shutdown ()은 소켓의 읽기 및 쓰기 기능을 끄는 데 사용되며 일반적으로 socket_close () 와 함께 사용됩니다. 구문은 다음과 같습니다.

 bool socket_shutdown ( resource $socket [, int $how = 2 ] )
  • $ socket : 닫히는 소켓 자원을 나타냅니다.

  • $ how : 닫을 방법을 지정하고 기본값은 2입니다. 바람직한 값 :

    • 0 : 소켓의 쓰기 기능을 끕니다.

    • 1 : 소켓의 읽기 기능을 끕니다.

    • 2 : 소켓의 읽기 및 쓰기 기능 (기본값).

3. 왜 socket_shutdown ()을 사용합니까?

연결을 직접 닫으려면 Socket_Close ()를 호출하면 데이터가 완전히 전송되지 않을 수 있습니다. socket_shutdown ()은 다음을 보장합니다.

  • 연결은 클라이언트 나 서버가 데이터를 작성한 후에 만 ​​시작됩니다.

  • 보다 세련된 셧다운 제어를 제공하여 읽기 및 쓸 수있는 작업을 별도로 끄질 수 있습니다.

  • 상대방이 적절한 청소 작업을 수행 할 시간이 있도록 연결이 종료 될 예정임을 미리 알립니다.

4. 예 : 소켓 연결을 우아하게 닫는 방법

다음은 소켓 연결을 우아하게 닫는 방법의 기본 예입니다.

 <?php
// a TCP/IP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    echo "Socket 창조가 실패했습니다:".socket_strerror(socket_last_error());
    exit;
}

// 지정된 것에 결합합니다 IP 그리고 포트
$bind = socket_bind($socket, '127.0.0.1', 8080);
if ($bind === false) {
    echo "바인딩이 실패했습니다:".socket_strerror(socket_last_error());
    exit;
}

// 클라이언트 연결을 듣기 시작하십시오
$listen = socket_listen($socket);
if ($listen === false) {
    echo "듣기 실패:".socket_strerror(socket_last_error());
    exit;
}

echo "연결을 기다리고 있습니다...\n";

// 연결을 수락하십시오
$client_socket = socket_accept($socket);
if ($client_socket === false) {
    echo "연결을 수락하십시오失败:".socket_strerror(socket_last_error());
    exit;
}

// 클라이언트 메시지를 읽으십시오
$input = socket_read($client_socket, 1024);
echo "메시지를 받았습니다:$input\n";

// 고객에게 응답을 보내십시오
socket_write($client_socket, "수신 된 데이터。\n");

// 사용 socket_shutdown 연결을 우아하게 닫습니다
socket_shutdown($client_socket, 2); // 읽기 및 쓰기 작업을 끄십시오
socket_close($client_socket); // 연결을 완전히 닫습니다

// 마지막으로 서버를 닫습니다 socket
socket_shutdown($socket, 2);
socket_close($socket);

echo "연결은 우아하게 닫혔습니다。\n";
?>

5. socket_shutdown () 의 시나리오 사용

  • 클라이언트는 적극적으로 연결을 끊습니다 . 서버에서 데이터 전송에 영향을 미치지 않고 데이터를 전송 한 후 클라이언트가 연결을 끊으려면 socket_shutdown ()을 호출하여 서버에 데이터 수신을 중지하도록 알릴 수 있습니다.

  • 서버 측에서 연결을 닫으십시오 : 서버가 클라이언트 요청을 처리 한 후 먼저 데이터 쓰기를 닫은 다음 읽기 작업을 닫을 수 있습니다. 서버는 클라이언트가 연결을 닫기 전에 모든 데이터를 수신하도록해야합니다.

6. 주목할만한 것들

  • 시퀀스 문제 : 소켓을 닫을 때 Socket_Shutdown ()을 먼저 수행 한 다음 Socket_Close ()를 호출해야합니다. 그렇지 않으면 마지막 데이터 전송이 손실 될 수 있습니다.

  • 오류 처리 : socket_shutdown ()을 사용하는 경우, 가능한 오류를 적시에 처리하려면 작업의 각 단계의 반환 값을 확인하는 데주의를 기울여야합니다.

  • 다중 스레드/다중 연결 환경 : 동시 네트워크 환경에서는 잘못된 종료 방법으로 인한 자원 누출 또는 연결 예외를 피하기 위해 각 연결의 수명주기를 관리하는 데주의를 기울여야합니다.

7. 요약

Socket_shutdown ()은 개발자가 소켓 연결을 우아하게 닫아서 셧다운 프로세스 중에 데이터가 손실되지 않고 다른 연결에 영향을 미치지 않도록하는 매우 유용한 기능입니다. Socket_shutdown () 을 올바르게 사용하면 네트워크 통신의 안정성과 효율성을 향상시킬 수 있으며 모든 PHP 개발자가 마스터 해야하는 기본 기술 중 하나입니다.