소스 파일명 : php_echo_server.php
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
<?php // (2018.7.16, 차재복, Cha Jae Bok, cjbword@gmailcom) 

	// html 및 문자셋 선언
	echo "<!DOCTYPE html>";
	echo "<html>";
	echo "<meta http-equiv='content-type' content='text/html; charset=utf-8'>";

	// 변수 설정
	$host = "127.0.0.1";	// 동일 호스트 내 서버,클라이언트 
	$port = 10001;			// 동일 호스트 내 동일 포트번호

	// 에코 서버 응답 타임아웃 설정 : 0 (무한대) 
	set_time_limit(0);

	// 소켓 생성
	$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die("Could not create socket\n");

	// 생성된 소켓에, 소켓주소(로컬 IP 주소 및 포트 번호) 할당
	socket_bind($socket, $host, $port) or die("Could not bind to socket\n");

	// 누군가 생성된 소켓에 커넥션을 맺기를 무한정 기다림
	socket_listen($socket, 3) or die("Could not set up socket listener\n");

	$i=1;
	while ($i <= 3) { // or $input == 'exit'

		// 소켓 연결 요청 수락
		$spawn = socket_accept($socket) or die("Could not accept incoming connection\n");

		// 수락 소켓 정보 및 카운트
		echo "<br>{$i}번째 소켓 수락 ({$spawn})<br>";

		// 클라이언트에서 전송한 메세지를 1024 바이트 만큼 만 읽기
		$input = socket_read($spawn, 1024) or die("Could not read input\n");

		// 클라이언트로부터 수신한 메세지를 화면에 출력
		echo "클라이언트에서 수신한 메세지 : ".trim($input)."<br>";

		// 클라이언트로부터 수신한 메세지를 다시 클라이언트에 재전송(에코)
		$output = strrev($input) . " ({$i}번째 에코)\n";
		socket_write($spawn, $output, strlen ($output)) or die("Could not write output\n");

		// 클라이언트에로 다시 재전송한 메세지를 화면에 출력
		echo "클라이언트에로 재전송(에코)한 메세지 : ".$output."<br>";

		// 수락된 개별 소켓 종료
		socket_close($spawn);	// 클라이언트 요청에 개별 수락한 소켓 종료

		$i = $i + 1;

	}

	socket_close($socket);	// 에코 서버 메인 소켓 종료
	echo "<br>에코서버 종료됨 !!!";
?>