PHP를 사용하여 소켓 기반 네트워크를 프로그래밍 할 때 연결을 설정하고 연결하는 것이 두 가지 주요 단계입니다. 여기서 socket_accept ()는 클라이언트의 연결을 수락하는 데 사용되며 Socket_shutdown ()은 연결을 닫는 데 사용됩니다. 이 두 기능의 적절한 페어링은 의사 소통의 안정성과 자원 방출을 보장하는 데 특히 중요합니다. 이 기사는 올바른 사용법과 예방 조치를 깊이 탐구합니다.
서버가 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는 계속 듣고 있습니다.
socket_shutdown ()은 기존 연결의 읽기, 쓰기 또는 읽기 및 쓰기를 닫는 데 사용됩니다. 프로토 타입은 다음과 같습니다.
bool socket_shutdown(resource $socket, int $how = 2);
매개 변수의 값 $ how :
0 : 읽기 쪽을 닫으십시오
1 : 쓰기 쪽을 닫습니다
2 : 읽기 및 쓰기 끄기 (기본값)
Socket_shutdown ()을 사용하여 상대방에게 우아하게 알리십시오. 연결이 닫히고 있습니다. "우발적 인 연결이 끊어지기 때문에 클라이언트 오류를 피할 준비가되어 있습니다.
최종 통신 : 먼저 전송할 데이터를 작성하여 쓰기 버퍼가 지워 졌는지 확인하십시오.
socket_shutdown () : 연결을 우아하게 닫습니다.
call socket_close () : 릴리스 소켓 리소스.
예:
socket_write($client, "안녕히 가세요,방문해 주셔서 감사합니다 m66.net\r\n");
// 쓰기와 읽기를 닫습니다
socket_shutdown($client);
// 리소스를 자유롭게합니다
socket_close($client);
이 순서는 클라이언트가 메시지 전송 중에 닫히지 않고 "Goodbye"메시지를받을 수 있도록합니다.
오류 사용 : 데이터가 완료되지 않은 경우 즉시 socket_shutdown ()
socket_write($client, "안녕히 가세요"); // 데이터는 여전히 버퍼에있을 수 있습니다
socket_shutdown($client);
이 관행으로 인해 고객은 완전한 정보를받지 못할 수 있습니다. 쓰기가 완료되었음을 확인한 후에는 닫아야합니다.
오류 사용 : socket_accept ()가 연결을 닫지 않습니다
socket_shutdown () 및 socket_close () 가 호출되지 않으면 자원이 누출되고 파일 디스크립터의 소진으로 인해 오랫동안 실행 된 후에 충돌합니다.
일부 시나리오 (예 : 동시 서버)에서는 차단 모드가 사용됩니다. 이 시점에서 socket_accept ()가 성공적으로 반환되는지 여부를 확인하고 빈 연결에서 socket_shutdown ()을 호출하지 않고 경고를 일으키지 않도록주의해야합니다.
socket_set_nonblock($server);
$client = @socket_accept($server);
if ($client !== false) {
// 의사 소통 및 종료 논리
}
PHP에서 socket_accept ()를 사용하여 연결을 수신 한 후 Socket_shutdown () 및 Socket_close () 와 협력하여 리소스를 해제하십시오. socket_shutdown () 의 기능은 우아하게 연결을 끊고 상대방이 잔인하게 연결을 끊지 않고 연결을 끊을 준비를하도록 통지하는 것입니다. 이 올바른 프로세스를 마스터하면 소켓 커뮤니케이션의 견고성과 사용자 경험이 향상 될 수 있습니다.
실제 개발에서 여러 클라이언트 또는 더 복잡한 논리가 관련된 경우 Stream_Socket_Server () 와 같은 고차 인터페이스를 결합하거나 이벤트 중심 처리에 Select () / poll ()을 사용하여보다 안정적인 네트워크 서비스를 달성하는 것이 좋습니다.