라이브러리

[PHP] socket_select - 지정된 시간 제한으로 주어진 소켓 배열에 대해 select() 시스템 호출을 실행합니다.




PHP에서 Socket Select

PHP에서 Socket Select는 I/O 다중화 기술 중 하나입니다. Socket Select는 하나 이상의 소켓에서 읽기/쓰기 가능 여부를 체크하는 데 사용됩니다. 이 기능은 네트워크 소켓에서 데이터를 읽거나 쓰기 위해 대기하는 동안 다른 작업을 수행할 수 있도록 합니다.

Socket Select의 특징

- I/O 다중화: Socket Select는 하나 이상의 소켓에서 읽기/쓰기 가능 여부를 체크하는 데 사용됩니다.
- 대기: Socket Select는 소켓에서 데이터를 읽거나 쓰기 위해 대기할 수 있습니다.
- 다중 스레딩: Socket Select는 다중 스레딩을 지원하지 않습니다. 하지만, PHP 7.4 이상 버전부터는 `pcntl_fork()` 함수를 사용하여 다중 스레딩을 구현할 수 있습니다.

Socket Select의 사용법

1. `socket_select()` 함수를 사용하여 소켓 목록을 체크합니다.
2. 체크 결과에 따라 소켓을 읽거나 쓰기 위해 대기합니다.
3. 대기 중인 소켓에서 데이터를 읽거나 쓰기 위해 `socket_read()` 또는 `socket_write()` 함수를 사용합니다.

예제

다음 예제는 Socket Select를 사용하여 클라이언트와 서버 간의 통신을 구현하는 방법을 보여줍니다.

#hostingforum.kr
php

<?php



// 서버 소켓 생성

$server_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_bind($server_socket, 'localhost', 8080);

socket_listen($server_socket);



// 클라이언트 소켓 목록

$client_sockets = array($server_socket);



// 클라이언트와 서버 간의 통신

while (true) {

    // Socket Select를 사용하여 소켓 목록을 체크합니다.

    $read_sockets = $write_sockets = $except_sockets = $client_sockets;

    $result = socket_select($read_sockets, $write_sockets, $except_sockets, 0);



    // 클라이언트와 서버 간의 통신을 처리합니다.

    if ($result) {

        foreach ($read_sockets as $client_socket) {

            // 클라이언트에서 데이터를 읽습니다.

            $data = socket_read($client_socket, 1024);

            if ($data) {

                echo "클라이언트에서 데이터를 받았습니다: $data
";

                // 클라이언트에게 데이터를 보냅니다.

                socket_write($client_socket, "서버에서 데이터를 보냈습니다.");

            } else {

                // 클라이언트가 연결을 끊었습니다.

                socket_close($client_socket);

                unset($client_sockets[array_search($client_socket, $client_sockets)]);

            }

        }



        foreach ($write_sockets as $client_socket) {

            // 클라이언트에게 데이터를 보냅니다.

            socket_write($client_socket, "서버에서 데이터를 보냈습니다.");

        }

    }



    // 새로운 클라이언트를 연결합니다.

    $new_client_socket = socket_accept($server_socket);

    $client_sockets[] = $new_client_socket;

}



// 서버 소켓을 닫습니다.

socket_close($server_socket);



?>



#hostingforum.kr
php

<?php



// 클라이언트 소켓 생성

$client_socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_connect($client_socket, 'localhost', 8080);



// 서버와 클라이언트 간의 통신

while (true) {

    // 서버에게 데이터를 보냅니다.

    socket_write($client_socket, "클라이언트에서 데이터를 보냈습니다.");

    // 서버에서 데이터를 읽습니다.

    $data = socket_read($client_socket, 1024);

    if ($data) {

        echo "서버에서 데이터를 받았습니다: $data
";

    } else {

        // 서버가 연결을 끊었습니다.

        break;

    }

}



// 클라이언트 소켓을 닫습니다.

socket_close($client_socket);



?>



이 예제는 Socket Select를 사용하여 클라이언트와 서버 간의 통신을 구현하는 방법을 보여줍니다. 클라이언트와 서버는 Socket Select를 사용하여 데이터를 읽고 쓰기 위해 대기합니다. 대기 중인 소켓에서 데이터를 읽거나 쓰기 위해 `socket_read()` 또는 `socket_write()` 함수를 사용합니다.
  • profile_image
    나우호스팅 @pcs8404 

    호스팅포럼 화이팅!

    댓글목록

    등록된 댓글이 없습니다.

  • 전체 8,985건 / 180 페이지

검색

게시물 검색