본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]박춘우_7월18일 월요일 Daily Report

by 알 수 없는 사용자 2011. 7. 18.
728x90
반응형

  ★ Network


서버를 통해 클라이언트가 에코 메시지를 보내는 예제를 넘어서 서버와 클라이언트가 콘솔에 입력한 문자열을 송수신 되도록 해보자. 송신과 수신을 동시에 가능하도록 하기 위해서는 여러가지 방법이 있을 수 있다. 그 중 fork 함수를 이용하여 부모 프로세스와 자식 프로세스를 생성한 후, 송신과 수신을 역할을 분담하여 수행하도록 해보자. 부모 프로세스와 자식 프로세스는 소켓 API 를 공유하여 사용하므로 부모 프로세스는 키보드로 부터 입력받아 송신 하는 역할을 하도록 구성하고, 자식 프로세스는 송신된 메시지를 출력하는 역할을 하도록 하면 될 것이다. 다음 그림을 통해 살펴 보면 이해가 쉽다.



서버에서 부모 프로세스는 표준입력을 통해 키보드로 입력 받은 문자열을 소켓을 통해 클라이언트로 메시지를 전송한다. 클라이언트에서 자식 프로세스가 서버에서 전송한 메시지를 읽어들인다. 표준출력으로 클라이언트의 콘솔창에 출력해준다.
반대로 클라이언트에서 부모 프로세스는 키보드로 입력 받은 문자열을 전송하면, 서버의 자식 프로세스가 클라이언트에서 전송한 메시지를 읽어서 서버의 콘솔창에 출력해준다.

소스코드를 통해 살펴보자. 소스코드는 서버와 클라이언트 각각 두개의 파일로 구성되어 있다.




★ 소스 코드

< talk_server.c >


< talk_client.c >




★ 소스 코드 설명
 

프로세스를 생성하는 코드를 살펴보자.

fork_ret = fork();


fork 함수는 부모 프로세스에게 자식 프로세스의 PID 를 리턴하고 자식 프로세스에게는 0 을 리턴한다. 실패할 경우에는 -1 을 부모 프로세스에게 리턴한다. 자식 프로세스는 생성되지 않았기 때문에 리턴되는 것은 없다. 
서버와 클라이언트 모두 부모 프로세스가 송신의 역할을 한다. 서버의 부모 프로세스가 동작하는 부분이지만 클라이언트의 부모 프로세스와 거의 흡사하며 원리는 똑같다.

if( 0 < fork_ret )
{
	/* 부모 프로세스는 키보드 입력을 서버로 송신 */
	while( 0 != fgets(sendline, MAXLINE, stdin) )
	{
		size = strlen(sendline);
		if( size != write(client_sock, sendline, strlen(sendline)) )
		{
			printf("Error in write. \n");
		}
		if( 0 != strstr(sendline, escapechar) )	// 종료 문자열 입력시 처리
		{
			printf("Good bye. \n");
			close(client_sock);
			exit(0);
		}
	}
}


fork_ret 가 0 보다 크면 자식 프로세스가 성공적으로 생성되고 fork_ret 의 값은 자식 프로세스의 PID 를 의미한다. 따라서 위의 동작은 서버의 부모 프로세스가 키보드로 입력 받은 문자열을 전송한다. 전송된 메시지는 클라이언트 자식 프로세스가 읽어서 콘솔에 전송된 문자열을 출력한다. 
자식 프로세스는 수신 역할을 하며 다음과 같다. 역시 서버의 자식 프로세스의 동작 코드이며, 클라이언트의 자식 프로세의 동작 코드와 원리는 똑같다.

else if( 0 == fork_ret )
{
	/* 자식 프로세스는 서버로부터 수신된 메시지를 화면에 출력 */
	while(1)
	{
		size = read(client_sock, recvline, MAXLINE);
		if( 0 > size )
		{
			printf("Error if read. \n");
			close(client_sock);
			exit(0);
		}
		recvline[size] = '\0';
		if( 0 != strstr(recvline, escapechar) )	// 종료 문자열 입력시 처리
		{
			break;
		}
		printf("%s", recvline);	// 화면 출력
	}
}


fork_ret 의 값이 0 이라면 자식 프로세스를 의미한다. 따라서 서버의 자식 프로세스는 클라이언트의 부모 프로세스가 전송한 메시지를 읽어서 콘솔에 출력한다. 서버의 기준이였고, 클라이언트의 기준으로 해도 역시 똑같다. 다음과 같이 문자를 입력하면 서버에서는 클라이언트로 클라이언트는 서버로 문자들을 전송한다. 다음은 서버와 클라이언트 사이에 메시지가 송수신 되는 콘솔 화면이다.





현재 프로세스의 상태를 살펴보면 서버에 2 개의 프로세스와 클라이언트의 2 개의 프로세스가 존재하고 있다.



exit 를 입력하게 되면 종료하게 된다. 하지만 프로그램은 종료되지만 프로세스가 종료되지 않은 상태로 남아있게 된다. 이로 인해서 이상현상이 발생한다. 서버에서 exit 로 종료를 하지만 클라이언트에서 계속해서 서버에 메시지를 전송한다.





exit 가 된 상태에서의 프로세스 상태를 살펴보자.



서버의 프로세스가 종료되었다. 이는 서버의 부모 프로세스가 종료된 것이다. exit 입력 받아 종료하는 프로세스는 부모 프로세스이기 때문이다. 자식 프로세스가 종료되기 전에 부모 프로세스가 종료되어 문제가 발생한다. 이를 해결하기 위해서는 부모 프로세스와 자식 프로세스의 역할을 바꾸면 어느 정도 해결할 수 있다. 자식 프로세스를 먼저 종료시킨 후에 부모 프로세스를 종료되게 구현을 하면된다.

 



 





★ JAVA


JAVA 는 객체지향 프로그래밍 언어이다. 객체지향 프로그래밍이란 모든 데이터를 오브젝트 (object: 물체) 로 취급하여 프로그래밍 하는 방법으로, 처리 요구를 받은 객체가 자기 자신의 안에 있는 내용을 가지고 처리하는 방식을 말한다. 1991년 Sun Microsystem 의 Green project 라는 연구진으로부터 오크 (Oak) 라는 언어가 개발되면서 자바가 시작 되었다. 
하드웨어는 빠르게 발전하는 반면 소프트웨어의 발전은 하드웨어에 비해 많은 발전을 하지 못하였다. C 언어를 아직도 사용하고 있는 것만봐도 알 수 있다. 물론 C 언어가 잘 만들어진 언어임은 틀림없다. 하드웨어는 제품들의 모듈화와 부품화가 잘 되어 있다. 제품의 표준이 정해져 있으므로 제조사와 상관없이 사용이 가능하다. 하지만 소프트웨어는 하나만 수정하더라도 전체적으로 많은 문제를 발생할 수 있고, 새로운 기능을 추가하면 다른 곳에서 문제가 발생하기도 한다. 이를 Ripple Effect (파급 효과) 라 한다. 이러한 문제점을 해결하기 위해 객체지향 프로그래밍이 도입되었다. 기존의 C 언어는 프로그램을 수정하기 위해서는 전체를 수정하거나 새로 만들어야 하는 문제점이 있어 프로그램을 만드는 시간이 오래 걸렸다. 반면에 자바와 같이 객체지향 프로그래밍은 소스코드를 재활용하여 시간과 생산량을 증가시켰다. 자바는 약 30 % 정도는 소스코드가 제공되며 이를 재활용 하여 사용하면 된다. 하지만 생산량이 증가하더라도 2 ~ 3 배 만큼 엄청나게 증가하지는 않는다. 또한 새로운 신기술은 새로운 것을 배워야 하는 문제점과 새로운 개념의 도입이 되는 위험 요소들이 존재한다.
자바는 리눅스, 윈도우, 매킨토시 등 어떠한 환경에서도 같은 결과를 볼 수 있다. 그 이유는 자바는 JVM (Java Virtual Machine) 이라는 가상머신을 이용한다. 자바는 다음 그림과 같이 구성되어 있다.



자바는 하드웨어를 제어하기 위한 목적으로 만들어졌다. 따라서 소프트웨어지만 하드웨어의 기능을 할 수 있다. 하드웨어와 소프트웨어의 중간에 미들웨어의 역할을 한다. 예를 들면 하드웨어의 그래픽카드가 없다면, 소프트웨어로 그래픽카드가 있는 것처럼 사용할 수 있도록 할 수있다. 자바 플랫폼은 자바 프로그램을 실행되기 위해 제공되는 하드웨어적 프로그램이다. 가상 머신 위에 자바 API 를 이용하여 소스코드를 작성한다.

자바의 플랫폼은 다음과 같이 크게 3 가지로 분류한다.

J2SE ( Java2 Platform, Standard Edition )
J2EE ( Java2 Platform, Enterprise Edition )
J2ME ( Java2 Platform, Micro Edition )


J2SE 는 일반적인 PC 에서 사용하는 모든 프로그램을 만들 때 사용하는 플랫폼이다. J2EE 는 기업용 솔루션을 만들 때 사용하는 플랫폼으로 보안과 로깅(로그) 기능이 강화되어 있다. J2ME 는 하드웨어를 제어할 때 사용하는 플랫폼이다.




★ Java 설치
 


그럼 자바를 설치해보자. 아래의 사이트에 접속하여 다운을 받을 수 있다.


참고로 자바의 개발사 Sun Microsystem 는 Oracle 이라는 기업에 인수되어 Oracle 사이트에 접속해야한다. 사용 할 버전은 Java SE 6 Update 20 이다. 현재는 Java SE 6 Update 26 까지 업데이트 되어있다. 



<
Java SE 6 Update 20  설치하기 >




★ Java 환경변수 설정
 





★ Java 설치 확인법
 





★ 자바 컴파일





★ Eclipse 설치 및 컴파일
 

여러 가지 자바 개발툴 중에 많이 사용하는 eclipse 를 설치 해보자. 다음 사이트에 접속하면 다운을 받을 수 있다.




Eclipse IDE for Java Developers 를 다운 받으면 된다. 사용할 버전은 Helios Service Release 2 이다.

< 자바 개발툴 eclipse 설치 및 컴파일 하기 >

 


728x90