현재 위치: > 최신 기사 목록> "경고 : socket_accept ()에 대한 솔루션 Socket_accept ()를 사용할 때 매개 변수 1이 리소스가 될 것으로 기대합니다.

"경고 : socket_accept ()에 대한 솔루션 Socket_accept ()를 사용할 때 매개 변수 1이 리소스가 될 것으로 기대합니다.

M66 2025-05-29

소켓 프로그래밍에 PHP의 Socket_accept () 함수를 사용하는 경우 일반적인 경고 메시지는 다음과 같습니다.

 Warning: socket_accept() expects parameter 1 to be resource, bool given

오류는 다음을 의미합니다. Socket_accept () 함수는 수신 된 매개 변수가 리소스가 될 것으로 예상하지만 실제로 부울 값 (일반적으로 False )이 전달됩니다. 그렇다면 왜 예상 소켓 자원 대신 부울 유형의 값이 전달됩니까? 근본 원인은 socket_create () 또는 socket_bind () 또는 socket_listen () 의 단계가 실패하기 때문입니다.

오류의 원천

일반적인 소켓 서버 코드 구조를 살펴 보겠습니다.

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

while (true) {
    $client = socket_accept($socket);
    // ...클라이언트 연결을 처리합니다
}

행 중 하나 ( Socket_create () ) 중 하나가 False를 반환하면 $ 소켓은 유효한 소켓 자원이 아닙니다. Socket_Accept ($ sockect)를 호출 할 때 오류가 발생합니다. 부울 값 (False)이 유효한 리소스가 아닌 전달됩니다.

문제를 찾는 방법

Socket_Last_Error ()Socket_Strerror () 함수를 사용하여 자세한 오류 정보를 출력 할 수 있습니다.

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

if (!socket_bind($socket, '0.0.0.0', 8080)) {
    die("socket_bind() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $msg = "환영 M66 Socket 제공하다!\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}

이런 식으로 어떤 함수 호출이 실패하는지 쉽게 찾을 수 있으므로 근본적인 문제를 해결합니다.

일반적인 원인과 솔루션

  1. 불충분 한 권한 <br> 80 또는 21과 같이 1024 미만의 포트에 바인딩하려고하면 권한이 충분하지 않아 실패합니다. 해결책은 1024 이상의 포트를 사용하거나 관리자 권한으로 스크립트를 실행하는 것입니다.

  2. 항구는 점령되었습니다 <br> 포트가 다른 프로세스에 의해 점유 된 경우 socket_bind ()가 실패합니다. NetStat -tlnp (Linux) 또는 NetStat -Ono (Windows)와 같은 명령을 사용하여 포트 점유를 볼 수 있습니다.

  3. 불법 구속력 주소 <br> 지정된 IP 주소가 불법이거나 기계가 구성되지 않은 경우 Socket_bind ()가 실패합니다. 0.0.0.0 (모든 IP를 바인딩) 또는 기계의 실제 인트라넷 IP와 같이 경계 주소가 합법적이고 유효한 지 확인하십시오.

  4. PHP 소켓 확장자가 올바르게로드되지 않음 <br> 소켓 확장자가 php.ini 에서 활성화되어 있는지 확인하십시오. phpinfo () 또는 extension_loaded ( '소켓') 를 통해 확인할 수 있습니다.

예 : 사용 가능한 전체 PHP 소켓 서버 코드

 <?php

$host = '0.0.0.0';
$port = 9000;

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

if (!socket_bind($socket, $host, $port)) {
    die("socket_bind() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}

if (!socket_listen($socket)) {
    die("socket_listen() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}

echo "청취: $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "socket_accept() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n";
        continue;
    }

    $welcome = "방문에 오신 것을 환영합니다 m66.net ~의 Socket 제공하다!\n";
    socket_write($client, $welcome, strlen($welcome));
    socket_close($client);
}

socket_close($socket);

요약

socket_accept ()를 사용할 때 "매개 변수 1이 자원이 될 것"의 오류가 발생하면 문제가 socket_accept () 에 있다고 직접적으로 생각하지는 않지만 이전 socket_create () , socket_bind ()socket_listen () 이 성공적으로 실행되었는지 여부를 다시 추적해야합니다. 오류 판단 및 로그 출력을 추가하면 문제를 빠르게 찾아서 잘못된 링크에서 시간을 낭비하지 않을 수 있습니다.

이 기사 가이 일반적인 문제를보다 명확하게 이해하고 포지셔닝과 솔루션을 마스터하는 데 도움이되기를 바랍니다.