현재 위치: > 최신 기사 목록> Socket_Accept () 및 Socket_Shutdown ()을 올바르게 페어링하여 안전하게 분리하는 방법은 무엇입니까?

Socket_Accept () 및 Socket_Shutdown ()을 올바르게 페어링하여 안전하게 분리하는 방법은 무엇입니까?

M66 2025-06-23

PHP를 사용하여 소켓 기반 네트워크를 프로그래밍 할 때 연결을 설정하고 연결하는 것이 두 가지 주요 단계입니다. 여기서 socket_accept ()는 클라이언트의 연결을 수락하는 데 사용되며 Socket_shutdown ()은 연결을 닫는 데 사용됩니다. 이 두 기능의 적절한 페어링은 의사 소통의 안정성과 자원 방출을 보장하는 데 특히 중요합니다. 이 기사는 올바른 사용법과 예방 조치를 깊이 탐구합니다.

1. Socket_Accept () 이해

서버가 socket_create ()socket_bind ()를 사용하여 청취 소켓을 생성하고 바인딩하면 socket_listen () 을 통해 클라이언트 요청을 듣기 시작합니다. 현재 Socket_accept ()는 들어오는 연결 요청을 수락하고 클라이언트와 통신하는 데 사용되는 새 소켓 리소스를 반환해야합니다.

예:

 $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

while (true) {
    $client = socket_accept($server);
    if ($client) {
        socket_write($client, "방문에 오신 것을 환영합니다 m66.net\r\n");
        // 후속 커뮤니케이션 논리
    }
}

여기서 $ client 는 새로운 연결 소켓이며 $ Server는 계속 듣고 있습니다.

2. Socket_shutdown ()이 필요한 이유

socket_shutdown ()은 기존 연결의 읽기, 쓰기 또는 읽기 및 쓰기를 닫는 데 사용됩니다. 프로토 타입은 다음과 같습니다.

 bool socket_shutdown(resource $socket, int $how = 2);

매개 변수의 값 $ how :

  • 0 : 읽기 쪽을 닫으십시오

  • 1 : 쓰기 쪽을 닫습니다

  • 2 : 읽기 및 쓰기 끄기 (기본값)

Socket_shutdown ()을 사용하여 상대방에게 우아하게 알리십시오. 연결이 닫히고 있습니다. "우발적 인 연결이 끊어지기 때문에 클라이언트 오류를 ​​피할 준비가되어 있습니다.

3. 수정 마감 순서

  1. 최종 통신 : 먼저 전송할 데이터를 작성하여 쓰기 버퍼가 지워 졌는지 확인하십시오.

  2. socket_shutdown () : 연결을 우아하게 닫습니다.

  3. call socket_close () : 릴리스 소켓 리소스.

예:

 socket_write($client, "안녕히 가세요,방문해 주셔서 감사합니다 m66.net\r\n");
// 쓰기와 읽기를 닫습니다
socket_shutdown($client);
// 리소스를 자유롭게합니다
socket_close($client);

이 순서는 클라이언트가 메시지 전송 중에 닫히지 않고 "Goodbye"메시지를받을 수 있도록합니다.

4. 일반적인 실수를 피하십시오

오류 사용 : 데이터가 완료되지 않은 경우 즉시 socket_shutdown ()

 socket_write($client, "안녕히 가세요"); // 데이터는 여전히 버퍼에있을 수 있습니다
socket_shutdown($client);

이 관행으로 인해 고객은 완전한 정보를받지 못할 수 있습니다. 쓰기가 완료되었음을 확인한 후에는 닫아야합니다.

오류 사용 : socket_accept ()가 연결을 닫지 않습니다

socket_shutdown ()socket_close () 가 호출되지 않으면 자원이 누출되고 파일 디스크립터의 소진으로 인해 오랫동안 실행 된 후에 충돌합니다.

5. Socket_set_Block () 또는 비 블로킹 모드와 함께 사용하십시오

일부 시나리오 (예 : 동시 서버)에서는 차단 모드가 사용됩니다. 이 시점에서 socket_accept ()가 성공적으로 반환되는지 여부를 확인하고 빈 연결에서 socket_shutdown ()을 호출하지 않고 경고를 일으키지 않도록주의해야합니다.

 socket_set_nonblock($server);
$client = @socket_accept($server);
if ($client !== false) {
    // 의사 소통 및 종료 논리
}

6. 요약

PHP에서 socket_accept ()를 사용하여 연결을 수신 한 후 Socket_shutdown ()Socket_close () 와 협력하여 리소스를 해제하십시오. socket_shutdown () 의 기능은 우아하게 연결을 끊고 상대방이 잔인하게 연결을 끊지 않고 연결을 끊을 준비를하도록 통지하는 것입니다. 이 올바른 프로세스를 마스터하면 소켓 커뮤니케이션의 견고성과 사용자 경험이 향상 될 수 있습니다.

실제 개발에서 여러 클라이언트 또는 더 복잡한 논리가 관련된 경우 Stream_Socket_Server () 와 같은 고차 인터페이스를 결합하거나 이벤트 중심 처리에 Select () / poll ()을 사용하여보다 안정적인 네트워크 서비스를 달성하는 것이 좋습니다.