현재 위치: > 최신 기사 목록> socket_set_block + socket_recv는 데이터 차단 및 수신을 구현합니다

socket_set_block + socket_recv는 데이터 차단 및 수신을 구현합니다

gitbox 2025-05-26

수신을 차단하는 것은 무엇입니까?

차단 된 수신은 프로그램이 수신 함수를 호출하는 시점을 나타냅니다. 수신 버퍼에 데이터가 없으면 프로그램이 실행을 일시 중지하고 실행되기 전에 데이터가 도착할 때까지 기다립니다. 이렇게하면 수신 된 데이터가 완료되고 실시간으로 보장되지만 네트워크가 양호하지 않으면 프로그램이 오랫동안 기다릴 수 있습니다.

PHP의 기본 소켓은 차단 모드입니다. socket_set_nonblock을 사용하여 비 블로킹으로 설정하면 데이터가 없을 때 Socket_Recv는 즉시 반환됩니다.

기능 소개

  • socket_set_block (Resource $ 소켓) : bool

    지정된 소켓을 차단 모드로 설정합니다.

  • socket_recv (Resource $ 소켓, 문자열 및 $ buf, int $ len, int $ flags) : int | false

    소켓에서 데이터를받습니다. 차단 모드에서 데이터가 없으면 프로그램이 데이터가 도착할 때까지 기다립니다.

코드 예제

다음 예제는 서버에 연결 한 후 Socket_set_Block을 사용하여 소켓을 차단 모드로 설정 한 다음 Socket_recv를 사용하여 데이터를 차단하는 방법을 보여줍니다.

 <?php
// 만들다TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()) . "\n");
}

// 서버에 연결하십시오
$server_ip = 'gitbox.net';
$server_port = 8080;

$result = socket_connect($socket, $server_ip, $server_port);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}

// 설정socket차단 모드에서(기본적으로 이미 차단되었습니다)
socket_set_block($socket);

echo "연결이 성공적으로 연결됩니다,데이터 수신을 기다리고 있습니다...\n";

while (true) {
    $buffer = '';
    // ~에서socket가장 막힌 리셉션1024바이트
    $bytes = socket_recv($socket, $buffer, 1024, 0);
    if ($bytes === false) {
        echo "socket_recv failed: " . socket_strerror(socket_last_error($socket)) . "\n";
        break;
    } elseif ($bytes === 0) {
        // 연결이 닫힙니다
        echo "서버가 연결을 닫습니다\n";
        break;
    } else {
        echo "받았다 {$bytes} 바이트数据: $buffer\n";
    }
}

// 폐쇄socket
socket_close($socket);
?>

실행 프로세스 분석

  1. TCP 소켓을 만듭니다.

  2. 지정된 서버에 연결합니다 (도메인 이름은 gitbox.net 으로 대체 됨).

  3. 소켓이 차단되고 있는지 확인하려면 socket_set_block을 호출하십시오.

  4. Socket_Recv를 호출하십시오. 현재 데이터가 없으면 데이터가 읽을 수있을 때까지 차단하고 대기합니다.

  5. 데이터를 수신 한 후 인쇄하십시오.

  6. 서버가 연결을 닫으면 루프를 종료하고 소켓을 닫습니다.

요약

  • socket_set_block은 소켓이 차단 모드로 명시 적으로 설정하여 데이터가 차단되고 socket_recv 를 대기하는지 확인하십시오.

  • 차단 모드는 데이터 실시간 요구 사항이 높고 대기를 신경 쓰지 않는 시나리오에 적합합니다.

  • 프로그램이 차단되지 않으려면 socket_set_nonblock 또는 Set Socket Timeout을 사용할 수 있습니다.

차단 및 비 블로킹 메커니즘을 이해하면 다양한 애플리케이션 요구를 충족시키기 위해 네트워크 커뮤니케이션 프로그램을보다 유연하게 설계하는 데 도움이됩니다.