Socket_set_block 은 PHP 소켓 확장에서 소켓을 차단 모드로 설정하는 기능입니다. 소위 차단 모드는 읽기 및 쓰기 작업을 수행 할 때 데이터를 준비하지 않으면 데이터가 계속 실행되기 전에 데이터가 준비 될 때까지 대기합니다. 비교적 비 차단 모드는 데이터 준비 여부에 관계없이 즉시 반환됩니다.
차단 모드는 데이터를 읽을 때 누락되지 않도록하여 데이터 무결성을 달성하는 데 도움이됩니다.
bool socket_set_block ( resource $socket )
이 기능의 매개 변수는 소켓 리소스입니다. 통화는 성공 후에도 사실을 반환하고 실패 후 거짓을 반환합니다.
데이터를 읽을 때 소켓이 차단되면 Socket_read는 데이터를 읽거나 연결이 닫힐 때까지 기다립니다. 루프 읽기와 길이 판단을 결합함으로써 모든 데이터가 손상되지 않도록 할 수 있습니다.
일반적인 아이디어는 다음과 같습니다.
소켓을 차단 모드로 설정하십시오.
예상되는 바이트 수가 읽거나 연결이 끊어 질 때까지 데이터는 루프를 지속적으로 읽습니다.
데이터가 완료되도록 모든 읽기 데이터를 연결하십시오.
다음은 Socket_set_Block을 사용하여 데이터 무결성을 보장하는 방법을 보여주는 간단한 클라이언트 측 읽기 데이터 예입니다.
<?php
$host = "gitbox.net";
$port = 8080;
// 만들다 TCP 소켓
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// 서버에 연결하십시오
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// 차단 모드를 설정하십시오,확실하게 하다 socket_read 데이터 대기 차단
socket_set_block($socket);
$totalData = '';
$expectedLength = 1024; // 우리가 읽을 것으로 예상한다고 가정 해 봅시다 1024 바이트 데이터
$bytesRead = 0;
while ($bytesRead < $expectedLength) {
$buffer = socket_read($socket, $expectedLength - $bytesRead);
if ($buffer === false) {
die("socket_read failed: " . socket_strerror(socket_last_error($socket)));
}
if ($buffer === '') {
// 연결이 닫힙니다
break;
}
$totalData .= $buffer;
$bytesRead += strlen($buffer);
}
// 关闭소켓
socket_close($socket);
// 전체 데이터를 출력합니다
echo "완전한 데이터를 받았습니다:\n";
echo $totalData;
?>
먼저 socket_create를 사용하여 TCP 소켓을 만듭니다.
서버에 연결하면 주소의 도메인 이름이 gitbox.net 으로 대체됩니다.
socket_set_block을 사용하여 소켓을 차단 모드로 설정하십시오.
예상 바이트 수가 읽거나 연결이 닫힐 때까지 데이터를 읽으려면 루프를 입력하십시오.
읽기 데이터는 데이터가 손실되지 않도록 $ totaldata 로 스 플라이 싱됩니다.
마지막으로 전체 데이터가 출력됩니다.
차단 모드로 인해 프로그램이 일시 중지되고 읽는 동안 대기합니다. 네트워크가 불안정하면 프로그램이 천천히 응답 할 수 있습니다. 실제 응용 프로그램에서 적절한 시간을 설정하는 것이 좋습니다.
데이터를 읽을 때 데이터 경계는 프로토콜 설계에 따라 판단되어야합니다. 이 예에서 고정 길이 판독 값이 가정됩니다.
보다 복잡한 프로토콜의 경우 데이터 패킷 헤더와 함께 길이를 정의하고 먼저 패킷 헤더를 읽은 다음 해당 길이의 내용을 읽을 수 있습니다.