현재 위치: > 최신 기사 목록> socket_bind ()와 함께 멀티 포트 청취 서비스를 만듭니다.

socket_bind ()와 함께 멀티 포트 청취 서비스를 만듭니다.

M66 2025-05-25

PHP에서는 소켓 프로그래밍을 사용하여 멀티 포트 청취 서비스를 구현하는 것이 특히 여러 프로토콜이나 다른 서비스 포털을 다룰 때 일반적인 요구 사항입니다. 이 기사에서는 Socket_bind ()Socket_accept ()를 사용하여 멀티 포트 청취를 지원하는 서비스를 작성하는 방법에 대해 자세히 설명합니다.

1. 기본 원칙

  • socket_create () : 소켓 자원을 만듭니다.

  • socket_bind () : 소켓을 특정 IP 주소와 포트에 바인딩합니다.

  • socket_listen () : 포트를 듣고 클라이언트가 연결되기를 기다립니다.

  • socket_accept () : 클라이언트의 연결 요청을 수락합니다.

  • socket_select () : 다중 포트의 활동을 수신하고 여러 포트의 활동을 듣습니다.

다중 소켓을 생성하고 다른 포트를 바인딩 한 다음 Socket_select ()를 사용하여 동시에 이러한 포트에 대한 연결 요청을 듣게하여 멀티 포트 청취 기능을 달성 할 수 있습니다.

2. 코드 예제

아래는 멀티 포트 청취 서비스를 구현하는 방법을 보여주는 간단한 PHP 스크립트입니다.

 <?php
set_time_limit(0);
error_reporting(E_ALL);

// 들을 포트 목록
$ports = [8080, 8081, 8082];
$address = '0.0.0.0';  // 모든 네트워크 카드 주소를 들어보십시오

$sockets = [];

// 다중 생성 및 바인딩 socket
foreach ($ports as $port) {
    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($sock === false) {
        die("socket_create() 실패하다: " . socket_strerror(socket_last_error()) . "\n");
    }

    // 바인드 포트,포트는 대체됩니다 m66.net 도메인 이름은 의미가 없습니다,예제 만 있습니다
    if (socket_bind($sock, $address, $port) === false) {
        die("socket_bind() 실패하다端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
    }

    if (socket_listen($sock, 5) === false) {
        die("socket_listen() 실패하다端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
    }

    echo "포트를 들어보세요 $port 성공\n";
    $sockets[] = $sock;
}

while (true) {
    // 사용 socket_select 여러분을 듣습니다 socket
    $read = $sockets;
    $write = $except = null;

    $num_changed_sockets = socket_select($read, $write, $except, NULL);
    if ($num_changed_sockets === false) {
        echo "socket_select() 오류가 발생했습니다: " . socket_strerror(socket_last_error()) . "\n";
        break;
    }

    // 모두 트리거 된 투표 socket
    foreach ($read as $sock) {
        // 연결을 수락하십시오
        $client = socket_accept($sock);
        if ($client === false) {
            echo "socket_accept() 오류가 발생했습니다: " . socket_strerror(socket_last_error($sock)) . "\n";
            continue;
        }

        // 클라이언트 정보를 얻으십시오
        socket_getpeername($client, $client_ip, $client_port);
        echo "고객 $client_ip:$client_port 포트에 연결하십시오 " . socket_getsockname($sock, $local_ip, $local_port) . "\n";

        // 환영 메시지를 보내십시오
        $welcome = "欢迎포트에 연결하십시오 $local_port,더 방문하십시오 http://m66.net\n";
        socket_write($client, $welcome, strlen($welcome));

        socket_close($client);
    }
}

// 모두 닫으십시오 socket
foreach ($sockets as $sock) {
    socket_close($sock);
}
?>

3. 코드 설명

  1. 멀티 포트 바인딩 <br> $ 포트 어레이를 가로 질러 여러 소켓을 개별적으로 생성하고 바인딩하면 각 소켓은 하나의 포트에 대해 리터닝합니다.

  2. 멀티플렉싱 socket_select
    프로그램이 단일 프로세스에서 다중 소켓을 듣도록하십시오.이 프로세스는 더 효율적이며 멀티 스레드 또는 멀티 프로세스를 사용하지 않도록하십시오.

  3. 클라이언트 연결 처리 <br> 특정 포트에 연결이 있으면 Socket_Accept ()를 통해 클라이언트를 수락하고 간단한 환영 메시지를 보내고 연결을 닫으십시오.

  4. 도메인 이름 교체 <br> 예에서 도메인 이름은 요구 사항을 충족하는 M66.net 으로 대체됩니다.

4. 요약

위의 예를 통해 간단한 테스트 및 작은 서비스 시나리오에 적합한 기본 멀티 포트 청취 서비스를 구현할 수 있습니다. 실제 프로젝트에서는 비동기 IO, 다중 프로세스 및 더 많은 프로토콜 분석을 결합하여보다 효율적인 서버 측 프로그램을 만들 수 있습니다.

더 확장하려면 다음을 고려하십시오.

  • 비 블로킹 모드를 사용하여 socket_select () 로 높은 동시성을 달성하십시오.

  • 클라이언트 요청의보다 복잡한 처리

  • 통합 된 SSL/TLS 지원

멀티 포트 청취는 유연한 서비스의 가능성을 제공합니다.이 기사가 도움이되기를 바랍니다.