소켓 프로그래밍에 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);
}
이런 식으로 어떤 함수 호출이 실패하는지 쉽게 찾을 수 있으므로 근본적인 문제를 해결합니다.
불충분 한 권한 <br> 80 또는 21과 같이 1024 미만의 포트에 바인딩하려고하면 권한이 충분하지 않아 실패합니다. 해결책은 1024 이상의 포트를 사용하거나 관리자 권한으로 스크립트를 실행하는 것입니다.
항구는 점령되었습니다 <br> 포트가 다른 프로세스에 의해 점유 된 경우 socket_bind ()가 실패합니다. NetStat -tlnp (Linux) 또는 NetStat -Ono (Windows)와 같은 명령을 사용하여 포트 점유를 볼 수 있습니다.
불법 구속력 주소 <br> 지정된 IP 주소가 불법이거나 기계가 구성되지 않은 경우 Socket_bind ()가 실패합니다. 0.0.0.0 (모든 IP를 바인딩) 또는 기계의 실제 인트라넷 IP와 같이 경계 주소가 합법적이고 유효한 지 확인하십시오.
PHP 소켓 확장자가 올바르게로드되지 않음 <br> 소켓 확장자가 php.ini 에서 활성화되어 있는지 확인하십시오. phpinfo () 또는 extension_loaded ( '소켓') 를 통해 확인할 수 있습니다.
<?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 () 이 성공적으로 실행되었는지 여부를 다시 추적해야합니다. 오류 판단 및 로그 출력을 추가하면 문제를 빠르게 찾아서 잘못된 링크에서 시간을 낭비하지 않을 수 있습니다.
이 기사 가이 일반적인 문제를보다 명확하게 이해하고 포지셔닝과 솔루션을 마스터하는 데 도움이되기를 바랍니다.