Streams stream_socket_server

(PHP 5, PHP 7, PHP 8)

stream_socket_server — 인터넷 또는 Unix 도메인 서버 소켓 만들기


설명

stream_socket_server(
    string $address,
    int &$error_code = null,
    string &$error_message = null,
    int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
    ?resource $context = null
): resource|false
                

지정된 address에 스트림 또는 데이터그램 소켓을 만듭니다.

이 함수는 연결 수락을 시작하기 위해 stream_socket_accept()를 사용하여 소켓만 생성합니다.


매개변수

address
생성된 소켓 유형은 표준 URL 형식인 transport://target을 사용하여 지정된 전송에 의해 결정됩니다.

TCP 및 UDP와 같은 인터넷 도메인 소켓(AF_INET)의 경우 remote_socket 매개변수의 target 부분은 호스트 이름 또는 IP 주소 다음에 콜론 및 포트 번호로 구성되어야 합니다. Unix 도메인 소켓의 경우 target 부분은 파일 시스템의 소켓 파일을 가리켜야 합니다.

환경에 따라 Unix 도메인 소켓을 사용하지 못할 수 있습니다. 사용 가능한 전송 목록은 stream_get_transports()를 사용하여 검색할 수 있습니다. bulitin 전송 목록은 List of Supported Socket Transports을 참조하세요.

error_code
선택적 error_codeerror_message 인수가 있는 경우 시스템 수준 socket(), bind()listen() 호출에서 발생한 실제 시스템 수준 오류를 나타내도록 설정됩니다. error_code에 반환된 값이 0이고 함수가 false를 반환하면 bind() 호출 전에 오류가 발생했음을 나타냅니다. 소켓 초기화 문제 때문일 가능성이 큽니다. error_codeerror_message 인수는 항상 참조로 전달됩니다.
error_message
error_code 설명을 참조하십시오.
flags
소켓 생성 플래그의 조합으로 설정할 수 있는 비트마스크 필드입니다.

메모: UDP 소켓의 경우 flags 매개변수로 STREAM_SERVER_BIND를 사용해야 합니다.

context

반환 값

생성된 스트림을 반환하거나 오류가 발생하면 false를 반환합니다.


변경 로그

버전 설명
8.0.0 context는 이제 nullable입니다.

Examples

예제 #1 TCP 서버 소켓 사용

                  
<?php
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");
    fclose($conn);
  }
  fclose($socket);
}
?>
                  
                

아래 예제는 stream_socket_client()의 예제와 같이 시간 쿼리에 응답할 수 있는 시간 서버 역할을 하는 방법을 보여줍니다.

참고: 대부분의 시스템은 1024 미만의 포트에서 서버 소켓을 생성하기 위해 루트 액세스가 필요합니다.

예제 #2 UDP 서버 소켓 사용

                  
<?php
$socket = stream_socket_server("udp://127.0.0.1:1113", $errno, $errstr, STREAM_SERVER_BIND);
if (!$socket) {
    die("$errstr ($errno)");
}

do {
    $pkt = stream_socket_recvfrom($socket, 1, 0, $peer);
    echo "$peer\n";
    stream_socket_sendto($socket, date("D M j H:i:s Y\r\n"), 0, $peer);
} while ($pkt !== false);

?>
                  
                

메모

참고: 숫자 IPv6 주소(예: fe80::1)를 지정할 때 IP를 대괄호로 묶어야 합니다(예: tcp://[fe80::1]:80).


기타