PHP 소켓 (server.php, client.php) - 데이터 전달 예제
프로그래밍/PHP2023. 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
반응형
'프로그래밍 > PHP' 카테고리의 다른 글
Rocky Linux 9.x, PHP 8.1.x 환경에서 Laravel 10.33.0 설치하기 (0) | 2023.11.23 |
---|---|
PHP 코드를 실행해주는 사이트 (버전 선택 가능) (0) | 2023.11.17 |
PHP 에서 SQL Injection 방지 쿼리 사용법 두가지 (bind_param, PDO) (0) | 2022.08.30 |
PHP 날짜 비교하기 (0) | 2022.04.13 |
[PHP] AES-256-CBC 를 이용한 암호화 및 복호화 (0) | 2022.04.11 |
댓글()