U E D R , A S I H C RSS

데블스캠프2006/월요일/연습문제/웹서버작성/변형진

HJ's WebServer 0.3

  • 유연한 마임타입 설정으로 하이퍼 텍스트는 물론이고, 이미지 삽입, 멀티미디어 재생, 파일 다운로드도 모두 가능함
  • 웹서버에서 PHP 스크립트를 실행할 수 있음 (지원하는 확장자 : html, htm, php)
  • 디렉토리명으로 접근한 경우 index.html, index.htm, index.php 순서로 가져옴
  • 아직 다양한 보안 문제에 대한 해결 방법을 마련해놓지 않아, 지정된 디렉토리에 있는 파일만을 보이도록 허용함

To Do..

  • GET Method으로 넘어온 Query String를 처리한다.
  • POST Method, COOKIE 등으로 넘어온 데이터까지 처리할 수 있으면 더 좋다.

소스코드

~php
<?

$index_file = array("index.html", "index.htm", "index.php");
$host = "IP 주소 또는 도메인 네임";
$port = 8080;


set_time_limit(0);

if(!function_exists("mime_content_type"))
{
	function mime_content_type($f)
	{
		return exec(trim("file -bi ".escapeshellarg($f)));
	}
}

//echo str_repeat(" ",300);

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_setopt($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_listen($socket);

$i = 100;
while($i--)
{
	$client_socket = socket_accept($socket);
	$result = "";
	while(false!==($read = socket_read($client_socket, 100, PHP_NORMAL_READ)))
	{
		echo "> ".$read;
		if(!$read = trim($read)) $cnt++;
		else $cnt=0;
		if($cnt==3) break;
		flush();
		if(preg_match("/(GET|POST) (\/[^ \/]*) (HTTP\/[0-9]+.[0-9]+)/i", $read, $t))
		{
			$file = "/home/kesarr".$t[2];
			if(preg_match("/\/$/", $file))
			{
				foreach($index_file as $idxf)
				{
					if(is_readable($file.$idxf))
					{
						$file .= $idxf;
						break;
					}
				}
			}
			if(is_readable($file))
			{
				$size = @getimagesize($file);
				if($size['mime']) $mime = $size['mime'];
				else $mime = mime_content_type($file);
				$res[] = "HTTP/1.1 200 OK";
				$res[] = "Server: Kesarr's WebServer";
				$res[] = "Connection: close";
				$to_read = $file;
			}
			else
			{
				$res[] = "HTTP/1.1 404 Not Found";
				$res[] = "Server: Kesarr's WebServer";
				$res[] = "Content-Length: ".strlen("파일을 찾을 수 없습니다.");
				$res[] = "Connection: close";
				$res[] = "Content-Type: $size[mime];charset=UTF-8;";
				$res[] = "";
				$res[] = "파일을 찾을 수 없습니다.";
			}
		}
		if($read == "close")
		{
			break;
		}
		elseif($read == "a")
		{
			$result = $read;
		}
		elseif($read == "exit")
		{
			socket_close($client_socket);
			socket_close($socket);
			exit;
		}
	}
	if($res)
	{
		if($to_read)
		{
			if(preg_match("/\.(html|htm|php)$/", $to_read))
			{
				$buffer = shell_exec(trim("php ".escapeshellarg($to_read)));
				$res[] = "Content-Length: ".strlen($buffer);
				$res[] = "";
				$result = join("\r\n", $res);
				@socket_write($client_socket, $result);
				echo $result;
				@socket_send($client_socket, $buffer, strlen($buffer), 0);
				$buf = explode("\r\n\r\n", $buffer);
				echo $buf[0]."\r\n\r\nPHP Parse: ";
			}
			else
			{
				$res[] = "Content-Length: ".filesize($file);
				$res[] = "Content-Type: ".$mime;
				$res[] = "";
				$res[] = "";
				$result = join("\r\n", $res);
				@socket_write($client_socket, $result);
				echo $result;
				@socket_send($client_socket, $buffer, strlen($buffer), 0);
				if(preg_match("/^text\//", $mime))
				{
					$fp = fopen($to_read, "r");
					echo "ASCII Read: ";
				}
				else
				{
					$fp = fopen($to_read, "rb");
					echo "Binary-safe Read: ";
				}
				while(!feof($fp)){
					$buffer=fread($fp,128);
					@socket_send($client_socket, $buffer, strlen($buffer), 0);
				}
				fclose($fp);
			}
			echo $to_read;
		}
		else
		{
			$result = join("\r\n", $res);
			socket_write($client_socket, $result);
			echo $result;
		}
		echo "\r\n__EOF__\r\n\r\n";
		flush();
	}
	socket_close($client_socket);
	unset($res);
	unset($to_read);
	unset($result);
}

socket_close($socket);

?>

----
형진이 다 만들었네. ㅋㅋ 잘했다. 한가지 부탁할건 컴공으로 먹고 살라면 도메인 언어를 C나 Java로 바꾸는 게 필요할 것 같다. - eternalbleu
  • PHP로 짜면 스크립트 언어 특성상 프로그래밍이 즐겁다고나 할까요? 그런 느낌이 좋아서 PHP를 선호하긴 하지만, UI를 제외한 코어 루틴만큼은 레퍼런스와 샘플을 함께하면 대부분의 언어로 같은 루틴을 만들 수 있을 거라고 생각해요. 그래도 어느정도는 비 웹언어에 익숙해져야 하지않을까 싶어 C++, Java, C#을 고민하다 C#을 선택해서 해봤는데, C#이 클라이언트단 어플리케이션에서도 효용성을 가지려면 Windows Vista가 출시된 후의 상황을 지켜봐야 할 것 같고, 아직은 C/C++이 더 대세인건 분명해보이네요. 사실 저같은 경우에는 아직은 연구하고 싶은 관심사가 '대용량 데이터베이스 기반 검색 엔진'과 '형태소 분석 기반 자연어 처리'로 DB와 문자열 처리에 관한 부분인데, DB 처리는 일단 RDBMS에서만큼은 PHP처럼 수월한 언어가 없고, 문자열 처리는 Perl이 다른 언어들에 비해 월등하다보니 그런 언어를 도메인 언어로 해오지 않았나 싶네요. ㅋㅋ - 변형진
  • 내가 PHP 도 약간 해보고, JSP 나 Java 도 약간 해봤서 대충 심정을 알듯.. 나도 JSP랑 Java 써서 이번에 DB 프로젝트 개발 해보기전에는 웹에서는 PHP로 짜는게 가장 편하게 느껴졌었거든. 그래서 DB 프로젝트도 웹은 PHP 응용은 Java 이렇게 해 나갈려고 했는데 PHP가 Oracle 지원은 버전 5.x 부터 되서 걍 Jsp로 하게 됐지. 둘다 해본 소감은 언어적인 면에서는 뭐 PHP로 하나 Jsp로 하나 별 상관이 없는거 같고, 다만 결정 적인것은 개발환경및 Jsp 에서는 java 클래스를 가져다가 사용할수 있다는 점이었스. Jsp에서 하면 Junit 을 사용하여 Unit 테스트를 하면서 작성하기 수월했고, 또한 디버깅 환경도 Visual Studio 에서 디버깅 하듯이 웹을 한다는게 정말 좋았지. 또 java 클래스를 가져다가 사용할 수 있어서 여러 오픈 소스를 활용하기에도 좋고.(예를 들면 Lucene 같은 자바로 만든 오픈소스 검색 엔진..). 특히 Eclipse 라는 강력한 개발 환경이 있어서 Visual Studio 보다 더 개발이 수월할 정도..
    • 내가 아무리 이렇게 말해도 귀에 안들어 올거라고 생각은 하고.. 다만 한번 경험을 해보길 바래. 내가 지금 와서 조금 후회되는것은 위키를 Jsp,Java 로 안짜고 PHP로 짠것이니 만큼.. 그리고 컴공에서 제일 중요한 것은 특정한 언어 하나를 잘하는 것도 좋긴 한데, 나는 어떠한 것이 눈앞에 와도 금방 적응하고 배워서 써먹을수 있는 능력도 중요하다고 생각해. 그리고 검색 엔진에 관심이 있다면 오픈소스 검색엔진인 Lucene 을 한번 갖고 놀아봐. 그리고 실제로 간단한 것을 짜보고 싶으면 MemeHarvester 이 프로젝트 이어서 해도 되고. - namsang
상협이의 현태에 이은 작업이 느껴지는군 ㅋㅋ ㅡ_ㅡb 가장 중요한건 처음 대학에 왔을때 자기가 가진 관심분야에 대한 공부를 끝까지 해나가는 것이 중요할 듯. 처음 가지고 있었던 이상과 자신의 방향이 흔들리면 결국 이도 저도 아닌 그냥 코딩만 하다가 끝나버릴 수 있으니까. 일단 학과에서 하는 공부에만 만족하지 말 것. 가능하면 본인이 자신이 있고, 관심이 있는 분야의 지식을 지속적으로 학습해 가는 과정이 가장 중요하다고 생각함. 대학 입학할때의 실력으로 만족하지않고, 지속적인 노력을 통해 자신을 단련해 가는 과정 자체를 늘기는 사람이 됐으면 좋겠다. (결론은 나처럼 놀지말라는 이야기 ㅡㅡ;; 나중에 후회한다 ㅋㅋ) - eternalbleu
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:02
Processing time 0.0237 sec