PHP 소켓 (server.php, client.php) - 데이터 전달 예제

프로그래밍/PHP|2023. 7. 7. 12:47
반응형

PHP 를 이용해 Server 에서 소켓 파일을 만들어 실행한 상태에서 Client 가 데이터를 전달하는 예제입니다.

데이터 (Mac address) 를 보내면 Server 측에서 데이터 검증 후 출력하도록 작성하였습니다.

받은 데이터 로그는 /root/input_data.log 에 기록 됩니다.

 

# vi server.php

#!/usr/bin/php -q
<?php
set_time_limit(0);

define("_IP",    "0.0.0.0");
define("_PORT",  "80");

$sSock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sSock, SOL_SOCKET, SO_REUSEADDR, 1);

socket_bind($sSock, _IP, _PORT);
socket_listen($sSock);

pcntl_signal(SIGCHLD, SIG_IGN); 

function msg($msg) {
    echo "SERVER >> ".$msg;
}

// 맥어드레스 형식 검증
function isMacAddress($str) {
    $pattern = '/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/';
    return preg_match($pattern, $str);
}

while($sock = socket_accept($sSock)) {
    socket_getpeername($sock, $sockIp, $sockPort);
    msg("Client connect : ".$sockIp.":".$sockPort."\n");

    // 자식 프로세스 생성
    $pid = pcntl_fork();
    if($pid == -1) {
        msg("fork failed\n");
        exit;
    }
    if($pid == 0) {
        $input = socket_read($sock, 4096);

        // 헤더와 데이터 분리
        list($header, $data) = explode("\r\n\r\n", $input, 2);
        msg("Mac address : " . $data . "\n");

        // 결과 응답 및 Client 연결 해제
        if ($input != "") {
            socket_write($sock, "Received it well");
            msg("Client disconnect : ".$sockIp.":".$sockPort."\n");
            socket_close($sock);
        }

        // 데이터 검증
        if (isMacAddress($data)) {
            $validation = "OK";
        } else {
            $validation = "NotOK";
        }

        // 로그 기록
        $now = date("Y-m-d H:i:s");
        shell_exec("echo \"$now\" \"$data\" \"$validation\" >> /root/input_data.log");
        exit;
    }
}
?> 

 

맨 윗줄 #!/usr/bin/php -q 에는 실제 php 실행파일 경로를 적어줘야 합니다.

 

root 만 사용할 수 있도록 권한을 변경합니다.

# chmod 700 server.php

 

파일을 실행하여 80 포트를 오픈하고 client 의 수신을 대기합니다.

# php server.php

 

Client 파일을 만듭니다.

# vi client.php

<?php
$url = 'http://www.sysdocu.kr';    // 접속할 호스트명
$data = '00:d8:61:13:2a:b8';       // 전달하고 싶은 데이터 (여기에서는 Mac address)

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_exec($ch);
curl_close($ch);
?>

 

Server 측 소켓이 열린 상태에서 client.php 파일을 실행하면 미리 준비된 데이터가 전달 됩니다.

# php client.php

 

반응형

댓글()