현재 위치: > 최신 기사 목록> socket_read ()가 실패한 후 socket_clear_error ()로 다시 시도하는 방법

socket_read ()가 실패한 후 socket_clear_error ()로 다시 시도하는 방법

M66 2025-05-27

PHP 소켓에서 프로그래밍 할 때 Socket_read ()는 소켓에서 데이터를 읽는 일반적인 기능입니다. 그러나 실제 애플리케이션에서는 네트워크 조건 또는 연결 문제로 인해 Socket_read ()가 실패하여 잔여 오류 코드가 발생할 수 있습니다. 프로그램의 안정성과 견고성을 보장하기 위해서는 정시에 오류를 지우고 읽기 실패 후 다시 시도해야합니다. 현재 socket_clear_error () 함수는 편리합니다.

이 기사는 오류 처리 및 재시도를 위해 Socket_read ()Socket_clear_error ()를 결합하는 방법을 자세히 소개합니다.

1. socket_read ()의 간단한 검토

Socket_read ()는 연결된 소켓에서 데이터를 읽는 데 사용되며 구문은 다음과 같습니다.

 socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
  • $ 소켓 : 소켓 리소스.

  • $ 길이 : 읽을 최대 바이트 수입니다.

  • $ 유형 : 읽기 유형, 기본적으로 이진 읽기.

읽기가 성공하면 읽기 문자열이 반환됩니다. 실패하면 거짓이 반환됩니다.

2. 왜 socket_clear_error ()를 사용해야합니까?

Socket_read ()가 실패하면 오류 상태가 소켓 안에 남아서 후속 작업에 영향을 줄 수 있습니다. 예를 들어, socket_last_error ()는 마지막 오류 코드를 반환합니다. 오류 상태가 지워지지 않으면 프로그램이 항상 오류 상태에있을 수 있으므로 반복 실패가 발생할 수 있습니다.

Socket_clear_error ()는 소켓 오류 상태를 지우고 후속 작업을 정상적으로 실행할 수 있는지 확인하는 데 사용됩니다.

3. Socket_clear_Error ()를 올바르게 사용하고 다시 읽는 방법은 무엇입니까?

다음은 오류를 지우고 socket_read () 가 실패한 후 읽기를 다시 시도하는 방법을 보여주는 샘플 코드입니다.

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

// 서버에 연결하십시오(서버 주소와 포트를 가정합니다)
$server = "m66.net";
$port = 12345;
if (!socket_connect($socket, $server, $port)) {
    die("서버에 연결하십시오실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}

$maxRetries = 3;  // 최대 재 시도 수
$retryCount = 0;
$readLength = 1024;

while ($retryCount < $maxRetries) {
    $data = socket_read($socket, $readLength);

    if ($data === false) {
        // 读取실패하다,오류 코드를 가져옵니다
        $errorCode = socket_last_error($socket);
        $errorMsg = socket_strerror($errorCode);
        echo "socket_read 실패하다,오류 코드:$errorCode,오류 메시지:$errorMsg\n";

        // 명확한 오류
        socket_clear_error($socket);
        echo "지우기 socket 실수,다시 시도 할 준비가되었습니다...\n";

        $retryCount++;
        // 선택 과목:잠자리에 든 후 다시 시도하십시오,빈번한 요청을 피하십시오
        sleep(1);
        continue;
    }

    // 성공적으로 읽으십시오,출력 데이터 및 루프에서 점프합니다
    echo "데이터를 읽습니다:" . $data . "\n";
    break;
}

if ($retryCount === $maxRetries) {
    echo "재 시도 수가 최대에 도달했습니다,读取실패하다。\n";
}

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

4. 코드 분석

  1. 소켓 생성 및 연결 : 여기서 우리는 M66.net 포트에 연결합니다.

  2. 루프 데이터를 읽으려고 시도 : 최대 3 개의 판독 값이 시도되고 실패하면 오류 처리가 수행됩니다.

  3. 실패 처리 :

    • socket_last_error () 를 통해 오류 코드를 가져옵니다.

    • socket_strerror ()를 사용하여 오류 설명을 얻으십시오.

    • 오류 상태를 지우려면 socket_clear_error ()를 호출하십시오.

    • 다시 시도하기 전에 1 초 동안 기다리십시오.

  4. 읽기가 성공하면 데이터가 인쇄되고 루프가 종료됩니다 .

  5. 연결을 닫고 리소스를 해제하십시오 .

5. 요약

socket_read ()를 사용하여 데이터를 읽을 때 실패를 만나면 Socket_clear_error ()를 호출하여 오류를 지우는 것을 잊지 마십시오. 이렇게하면 오류 축적을 피하고 다음 작업의 올바른 실행을 보장 할 수 있습니다. 동시에 재시도 메커니즘과 결합하여 네트워크 통신의 안정성을 향상시킬 수 있습니다.