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.0058 sec