현재 위치: > 최신 기사 목록> stream_socket_server를 사용할 때 발생하는 일반적인 오류는 무엇입니까? 빨리 해결하는 방법?

stream_socket_server를 사용할 때 발생하는 일반적인 오류는 무엇입니까? 빨리 해결하는 방법?

gitbox 2025-06-27

1. 오류 : 지정된 주소에 바인딩 할 수 없습니다

오류 프롬프트 :

 <span><span>Warning: stream_socket_server(): unable to bind to tcp://127.0.0.1:8080 (Reason: Address already in use) in ...
</span></span>

해결책:

이 오류는 일반적으로 stream_socket_server를 사용하여 다른 프로그램이 차지한 포트 또는 주소에 바인딩하려고 할 때 발생합니다. 두 가지 해결책이 있습니다.

  • 포트가 점유되어 있는지 확인하십시오 : Netstat -tuln (Linux) 또는 LSOF -I : 8080 명령을 사용하여 다른 응용 프로그램에서 포트가 점유되었는지 확인하십시오.

  • 다른 포트 선택 : 포트가 점유 된 경우 사용되지 않은 포트를 선택하거나 해당 포트를 차지하는 서비스를 중지하십시오.


2. 오류 : 서버 리소스를 만들 수 없습니다

오류 프롬프트 :

 <span><span>Warning: stream_socket_server(): unable to create socket resource in ...
</span></span>

해결책:

이 오류는 시스템 제한 또는 권한 문제와 관련이있을 수 있습니다. 일반적인 이유는 다음과 같습니다.

  • 불충분 한 권한 : Linux 시스템에서는 루트 권한이 1024 미만의 포트에 바인딩되어야합니다. 솔루션은 더 높은 포트 번호를 사용하거나 관리자 권한이있는 스크립트를 실행하는 것입니다.

  • 시스템 리소스 제한 : 시스템은 열릴 파일 설명자 수에 제한이있을 수 있습니다. Ulimit -N 명령을 통해 현재 한계를보고 Ulimit -n <번호> 를 통해 한계를 늘릴 수 있습니다.


3. 오류 : 서버가 성공적으로 생성되었지만 연결을 수락 할 수 없습니다.

오류 프롬프트 :

 <span><span>Warning: stream_socket_accept(): unable to accept connection in ...
</span></span>

해결책:

서버 리소스를 성공적으로 작성했지만 여전히 연결을 수락 할 수없는 경우 다음과 같은 이유 일 수 있습니다.

  • 네트워크 구성 문제 : 바인딩 된 주소와 포트가 올바르고 네트워크가 연결되어 있는지 확인하십시오. 지역 개발 환경 인 경우 포트를 차단하는 방화벽이 없는지 확인하십시오.

  • 차단 문제 : 기본적으로 Stream_Socket_Server 는 차단 기능입니다. 연결이 나오지 않으면 기다릴 것입니다. 이 문제를 피하기 위해 비 블로킹 모드를 사용할 수 있습니다.

     <span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"tcp://127.0.0.1:8080"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN);
    </span><span><span class="hljs-title function_ invoke__">stream_set_blocking</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>);
    </span></span>

    이런 식으로 연결이 없어도 프로그램은 계속 실행할 수 있습니다.


4. 오류 : 소켓 연결이 예기치 않게 닫혔습니다

오류 프롬프트 :

 <span><span>Warning: stream_socket_accept(): connection reset by peer in ...
</span></span>

해결책:

이 오류는 일반적으로 클라이언트가 연결 직후에 연결을 닫거나 네트워크 고장이 발생할 때입니다. 다음과 같이 해결할 수 있습니다.

  • 연결 종료 이벤트 캡처 : 클라이언트 연결을 처리 할 때 예외를 처리하고 연결이 닫힌 후 리소스가 해제되어야합니다.

     <span><span><span class="hljs-variable">$client</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$client</span></span><span>) {
        </span><span><span class="hljs-comment">// 처리 연결</span></span><span>
        </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>); </span><span><span class="hljs-comment">// 연결을 닫으십시오</span></span><span>
    }
    </span></span>
  • 클라이언트 안정성 확인 : 오류 또는 예기치 않은 이유로 인해 클라이언트가 연결을 닫는 지 확인하십시오. 네트워크 패킷 캡처 도구 (예 : Wireshark)를 통해 클라이언트와 서버 간의 네트워크 상호 작용을보고 네트워크 문제를 해결할 수 있습니다.


5. 오류 : 클라이언트 데이터를 읽을 수 없습니다

오류 프롬프트 :

 <span><span>Warning: stream_socket_recvfrom(): unable to read from socket resource in ...
</span></span>

해결책:

이 오류는 일반적으로 클라이언트의 데이터를 읽으려고 할 때 발생합니다. 클라이언트가 데이터를 보내지 않거나 연결을 닫았 기 때문일 수 있습니다. 솔루션은 다음과 같습니다.

  • 클라이언트 동작 확인 : 클라이언트가 데이터를 전송 한 후 클라이언트가 데이터를 전송하고 연결을 미리 닫지 않도록하십시오.

  • 읽기 시간 초과 증가 : 클라이언트가 조만간 데이터를 보내겠다고 기대하면 읽기 시간 초과를 설정할 수 있습니다.

     <span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$client</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);  </span><span><span class="hljs-comment">// 10두 번째 시간 초과</span></span><span>
    </span></span>

6. 오류 : SSL/TLS 연결 오류

오류 프롬프트 :

 <span><span>Warning: stream_socket_server(): SSL operation failed with code 1. OpenSSL Error messages:
error:1408F119:SSL routines:SSL3_GET_RECORD:decryption failed or bad record mac in ...
</span></span>

해결책:

stream_socket_server 에서 ssl을 활성화하면 ssl/tls 관련 오류가 발생할 수 있습니다. 일반적인 이유는 다음과 같습니다.

  • 인증서 문제 : 올바른 SSL 인증서와 개인 키 파일을 제공하고 파일 경로가 올바른지 확인하십시오.

  • OpenSSL 구성 문제 : PHP 설치에 OpenSSL 확장 기능이 포함되어 있는지 확인하고 SSL 지원이 PHP 구성 파일 (php.ini)에서 활성화되어 있는지 확인하십시오.

     <span><span><span class="hljs-variable">$server</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_server</span></span><span>(</span><span><span class="hljs-string">"ssl://127.0.0.1:443"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
        </span><span><span class="hljs-string">'ssl'</span></span><span> =&gt; [
            </span><span><span class="hljs-string">'local_cert'</span></span><span> =&gt; </span><span><span class="hljs-string">'/path/to/cert.pem'</span></span><span>,
            </span><span><span class="hljs-string">'local_pk'</span></span><span> =&gt; </span><span><span class="hljs-string">'/path/to/private.key'</span></span><span>,
            </span><span><span class="hljs-string">'verify_peer'</span></span><span> =&gt; </span><span><span class="hljs-literal">false</span></span><span>,
        ]
    ]));
    </span></span>

    또한 OpenSSL 버전의 PHP를 확인하여 필요한 암호화 프로토콜을 지원하는지 확인할 수도 있습니다.