현재 위치: > 최신 기사 목록> strace 또는 netstat를 사용하여 socket_accept () 청취 상태 문제를 해결하십시오.

strace 또는 netstat를 사용하여 socket_accept () 청취 상태 문제를 해결하십시오.

M66 2025-06-03

PHP를 사용하여 소켓 기반 서버 응용 프로그램을 작성할 때 Socket_accept ()는 클라이언트 연결을 수신하는 핵심 기능입니다. 그러나 일부 시나리오에서는 프로그램 로직이 올바른 경우에도 Socket_accept ()는 정상적으로 연결을받지 못할 수 있습니다. 이 기사에서는 StraceNetstat 도구를 사용 하여이 문제를 신속하게 찾아서 해결하는 방법을 설명합니다.

1. 전제 조건 : 일반적인 PHP 소켓 서버 예제

다음은 Port 8080을 듣는 간단한 PHP 서버 프로그램입니다.

 <?php
$host = '0.0.0.0';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);

echo "Server listening on $host:$port\n";

while (true) {
    $client = socket_accept($socket);
    if ($client === false) {
        echo "Failed to accept connection\n";
        continue;
    }

    $msg = "Hello from server\n";
    socket_write($client, $msg, strlen($msg));
    socket_close($client);
}
?>

socket_accept () 가 붙어 있거나 항상 False를 반환하면 시스템 도구를 사용하여 심층적 인 문제 해결을 수행해야합니다.

2. Strace를 사용하여 시스템 통화를 추적하십시오

Strace 는 Linux의 시스템 통화 추적 도구입니다. 런타임시 PHP 스크립트에서 어떤 시스템 기본 기능을 호출하고 실행 결과를 직접 볼 수 있습니다.

단계:

  1. 예를 들어 PS를 사용하여 실행중인 PHP 프로세스 PID를 찾으십시오.

     ps aux | grep php
    
  2. Strace를 사용하여 프로세스에 연결하십시오.

     strace -p <PID> -e trace=network
    
  3. 다음 동작이 출력에 존재하는지 확인하십시오.

    • accept (...) = -1 : 시스템 호출이 실패했으며 일반적으로 오류 코드 (예 : eagain , econnaborted 등)와 함께).

    • 듣기 (...) 또는 바인딩 (...) 오류 : 포트가 점유되었거나 권한이 충분하지 않음을 의미 할 수 있습니다.

    • 수락 요청 없음 () : 프로그램이 다른 곳에 고착 될 수 있습니다.

strace show acccept () 가 정상이지만 여전히 연결 액세스 권한이 없으면 네트워크 계층이나 방화벽에 문제가있을 수 있습니다.

3. Netstat 또는 SS를 사용하여 청취 상태를 확인하십시오.

NetstatSS는 포트가 청취 상태에 있는지 여부와 연결이 설정되어 있는지 확인하는 데 사용될 수 있습니다.

청취 상태 확인 :

 netstat -tlnp | grep :8080

또는:

 ss -tlnp | grep :8080

다음과 유사한 출력을 볼 수 있어야합니다.

 tcp    LISTEN     0      128    0.0.0.0:8080    0.0.0.0:*     users:(("php",pid=12345,fd=3))
  • 청취가 없으면 socket_bind () 또는 socket_listen ()가 실패합니다.

  • 청취가 정상이지만 연결이없는 경우 클라이언트가 연결을 시작하지 않았거나 방화벽에 의해 차단 될 수 있습니다.

  • 상태가 close_wait 또는 time_wait 인 경우 연결 수명주기가 비정상적으로 끝나는 것을 의미합니다.

4. 추가 디버깅 제안

  1. 오류 메시지 <br>를 확인하십시오 각 소켓이 호출되면 Socket_strerr (socket_last_error ())를 사용하여 특정 오류 정보를보십시오.

  2. 방화벽 또는 Selinux 제한 <br> 8080 포트가 차단되지 않았 음을 확인하기 위해 iptables 또는 방화구를 사용하십시오.

  3. 항구는 다른 프로그램에 의해 점유됩니다 <br> LSOF -I : 8080을 사용하여 다른 프로그램이 항구를 점유하는지 확인하십시오.