'똘이'에 해당되는 글 71건

  1. 2013.03.05 pThread를 이용한 Thread by 똘이 임덕규
  2. 2013.03.04 5. Java 기본 문법 by 똘이 임덕규
  3. 2013.03.04 4. Java 통합 개발 환경 구성 by 똘이 임덕규
  4. 2013.03.04 3. Java Application 만들기 by 똘이 임덕규
  5. 2013.03.04 2. Java 프로그래밍을 위한 준비 by 똘이 임덕규
  6. 2013.03.04 Java의 기원과 특징 by 똘이 임덕규
  7. 2013.02.25 Static 변수 by 똘이 임덕규
  8. 2013.02.12 socket(), 소켓을 생성하여 반환한다. by 똘이 임덕규
  9. 2013.02.11 소켓 프로그램 기본 구조 - Server - by 똘이 임덕규
  10. 2013.02.11 소켓 프로그래밍 기본 형태 - 1 - by 똘이 임덕규

C에서 Thread를 구현하기 위해서는 pthread.h 함수를 사용해야 한다. 


기본적인 Thread 함수

pthread_create

int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
  • 쓰레드 생성을 위해서 사용 
  • 첫번째 인자인 thread 는 쓰레드가 성공적으로 생성되었을때 생성된 쓰레드를 식별하기 위해서 사용되는 쓰레드 식별자 
  • 두번째 인자인 attr 은 쓰레드 특성을 지정하기 위해서 사용, 기본 쓰레드 특성을 이용하고자 할경우에 NULL 을 사용 
  • 세번째 인자인 start_routine는 분기시켜서 실행할 쓰레드 함수
  • 네번째 인자는 쓰레드 함수의 인자
  • 리턴값은 성공시 0, 실패시 0 이상의 수

예제 example_1.c

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

/* 쓰레드 함수 */
void *t_function(void *data)
{
    int id;
    int i = 0;

    id = *((int *)data);

    while(1)
    {
        printf("%d : %d\n", id, i);
        i++;
        sleep(1);
    }

    return;
}

int main()
{
    pthread_t p_thread[2];

    int thr_id;
    int status;
    int a = 1;
    int b = 2;

    /* 쓰레드 생성 인자로 1을 넘긴다 */
    thr_id = pthread_create(&p_thread[0], NULL, t_function, (void *)&a);
    if(0 < thr_id)
    {
        perror("thread create error : ");
        exit(0);
    }

    /* 쓰레드 생성 인자로 2를 넘긴다 */
    thr_id = pthread_create(&p_thread[1], NULL, t_function, (void *)&b);
    if(0 < thr_id)
    {
        perror("thread create error : ");
        exit(0);
    }

    /* 쓰레드 종료를 기다린다
     * 실행된 쓰레드에 대해서는 pthread_join 등의 함수를 이용하여 쓰레드가 종료될 때까지 기다려 주어야 한다.
     * pthread_join은 일종의 fork의 wait과 비슷하게 작동하며, 쓰레드 자원을 해제 시켜준다.*/
    
    pthread_join(p_thread[0], (void **)&status);
    pthread_join(p_thread[1], (void **)&status);
    
    return 0;
}


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10

자바의 기본 문법은 C/C++과 유사하다

int i = 1;  // 주석  
int sum = 0; /* 주석 */
for(i = 1; i <= 10; i++)
{
    sum = sum + i;
}

코드의 일 부분으로서 C나 다른 언어에 비해 크게 다르지 않다. 


식별자(Identifier)

  • 변수, 클래스, 메소드, 레이블 등의 이름
  • 프로그래머가 만드는 이름
작명규친은 
  • 대소문자 구분
  • 길이에 제한이 없음
  • 영 대소문자, 한글, 숫자, '_', '$' 사용하며 숫자로 시작 할 순 없다.
  • 키워드들은 사용불가


저작자 표시
신고
통합 개발환경을 구성하여 편하게 개발할 수 있다.
  • IDE
    • 소스 편집, 컴파일, 실행, 디버깅 등
    • 다양한 Java IDE가 존재한다.
      • Eclipse
        • http://www.eclipse.org
        • Java 이외에도 다양한 언어를 지원
        • Eclipse IDE for Java Developers를 다운받아 설치



저작자 표시
신고

가장 보편적 첫 예제인 "Hello World"를 출력함으로서 시작을 해보자.


Hello World.java

public class HelloWorld {
    public static void main(String args[]) {
        System.out.println("Hello, Java Application");
    }
소스 작성시 유의할 점
  • main이 있는 class와 자바소스명은 같아야 함

컴파일
  • javac
    • javac HelloWorld.java 를 입력하고 실행함으로 Java VM에서 작동되는 Class 파일을 결과물로 얻을 수 있다.

실행

  • java
    • java HelloWorld 를 입력하면 아래와 같은 실행 결과를 확인할 수 있다.

자바와 C의 차이는

  • 자바는 Class로 이루어져 있으며 ,

  • C프로그램은 함수들로 이루어져 있다.


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

Java 프로그래밍을 위한 준비

Java SDK 설치 및 API 문서

환경 변수 설정
  • HOME 디렉토리에 있는 .profile 파일을 수정 아래의 경로들과 변수를 추가
    •   export JAVA_HOME="/usr/local/jdk1.6.0_12”
        export PATH=$PATH:$JAVA_HOME/bin
        export CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
      윈도우즈 일 경우
    • C:\Program Files\Java\jdk1.7.0_11\bin // Path
      .; // Class Path
      
    • 이클립스등을 사용할시 조금 다를 수 있다.


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

제임스 고슬링 박사 팀에서 가전용 프로그래밍에 사용되며 플랫폼에 구애받지 않는 언어를 찾던중 개발된 언어


특징

  • C/C++언어와 유사하나 단순함
  • 플랫폼에 독립적
    • 아키텍처 중립적, 시스템 독립성
  • 완전한 객체지향 언어
  • 웹 또는 네트워크 프로그래밍이 용의
  • 엄격한 자료형의 검사
  • 예외 처리 기능을 제공
  • 멀티 스레딩 지원
Java 프로그램의 실행
  • JAVA Source 를 컴파일하여 바이트 코드를 만듬
  • 바이트 코드
    • 자바의 실행환경 즉 자바 가상머신에서 구동되는 바이트 코드를 이용하여 실행 할 수 있게 된다.
    • 확장자는 Class 를 사용

Java 플랫폼

  • 플랫폼이란
    • 프로그램의 실행을 위한 하드웨어와 소프트웨어 환경
  • Java 플랫폼이란
    • Java 프로그램이 동작하기 위한 환경 또는 가상의 기계
    • 운영체제에 맞는 Java 플랫폼을 설치해야 한다.
Java 플랫폼의 구성
  • Java VM
    • Java 프로그랭의 실행 환경을 제공하는 가상 기계
    • Java 프로그램의 구동엔진
    • 실행에 필요한 사항을 관리
    • 메모리 정리(Garbage collector) 를 자동으로 수행
  • Java API
    • 프로그랭 개발에 필요한 클래스 라이브러리
    • 패키지들이 계층 구조로 분류되어 있음

애플리케이션과 애플릿

  • 애플리케이션
    • Java 플랫폼에서 바로 실행되는 프로그램
  • 애플릿
    • HTML 웹 페이지에 포함된 웹 브라우져를 통해 실행
    • 웹 브라우져는 Java VM을 포함함


저작자 표시
신고

'컴퓨터 언어 > Java' 카테고리의 다른 글

3. Java Application 만들기  (0) 2013.03.04
2. Java 프로그래밍을 위한 준비  (0) 2013.03.04
Java의 기원과 특징  (0) 2013.03.04

Static 변수의 특징

  • 다른 변수와 마찬가지로 해당하는 가장 윗 부분에 선언된다.
  • 전역 변수 처럼 '0' 으로 초기화 된다.
  • 함수가 끝나도 해당 값이 파괴되지 않는다.
  • 저장되는 메모리 영역은 전역 변수가 저장되는 정적 데이터 영역
  • 지역변수와 마찬가지로 해당 함수 안에서만 사용이 가능하다.

Static 변수의 특징을 잘 알아볼 수 있는 예제를 이용하여 정확히 파악

#include <stdio.h>

void printCount(void);

int main(void)
{
    int i;

    for(i = 0; 10 >= i; i++)
    {
        printCount();
    }
    
    return 0;
}

void printCount(void)
{
    static int i;

    printf("%d\n", i);
    i = i + 1;
    
    return;
}

함수 printCount 안의 변수인 i는 함수가 종료되어도 파괴되지 않고 값을 유지하고 있다. 



전역변수에서 static을 선언해 주면 다른 파일에서 해당 변수를 extern으로 건다해도 참조 할 수 없다.


저작자 표시
신고

'컴퓨터 언어 > C' 카테고리의 다른 글

pThread를 이용한 Thread  (0) 2013.03.05
Static 변수  (0) 2013.02.25
메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10

socket()

서버와 통신할 때 사용할 소켓을 생성할 수 있는 함수.

int s_socket;

s_socket = socket(PF_INET, SOCK_STREAM, 0);
if(-1 == s_socket)
{
    printf("Failed to make the socket\n");
    return (-1);
}
  • 헤더
    • #include <sys/types.h>
    • #include <sys/socket.h>

  • 형태
    • int socket(int domain, int type, int protocol);

  • 인수
    • int domain, 인터넷을 통해 통신할 지, 같은 시스템 내에서 프로세스 끼리 통신할지
      • PF_INET, AF_INET
        • IPv4 인터넷 프로토콜을 사용
      • PF_INET6
        • IPv6 인터넷 프로토콜을 사용
      • PF_LOCAL, AF_UNIX
        • 같은 시스템 내에서 프로세스 끼리 통신
      • PF_PACKET
        • Low level socket을 인터페이스로 사용
      • PF_IPX
        • IPX 노벨 프로토콜을 사용합니다.
    • int type, 데이터의 전송 형태를 지정
      • SOCK_STREAM
        • TCP/IP 프로토콜을 이용
      • SOCK_DGRAM
        • UDP/IP 프로토콜을 이용
    • int  protocol, 통신에 있어 특정 프로토콜 사용을 지정하기 위한 변수, 보통 0

  • 반환 값
    • -1 이외는 소켓 식별자
    • -1 은 실패



저작자 표시
신고

서버 프로그램

네트워크 연결 장치인 소켓을 생성하여 포트를 할당하고, 해당 포트로 클라이언트로부터의 연결 요청이 들어오면 즉시 연결, 준비된 문자열인 "Hello World"를 클라이언트측에 전송하도록 구현.



#include <stdio.h>     
#include <stdlib.h>
#include <string.h>
#include <netinet/in.h>
#include <sys/socket.h>

#define PORT 9000               /* 포트를 9000번으로 명시 */

char buffer[BUFSIZ] = "hello, world\n"; /* 보낼 문자열 */

int main()
{
    int c_socket;
    int s_socket;

    struct sockaddr_in s_addr;
    struct sockaddr_in c_addr;

    int len;
    int n;

    /* 클라이언트로 부터 연결 요청을 받을 수 있도록 Socket 함수를 이용,
     * 네트워크 연결 장치인 소켓을 생성한다.*/
    s_socket = socket(PF_INET, SOCK_STREAM, 0);

    /* 클라이언트로 부터 연결 요청을 받을 서버 IP주소와 포트를 설정
     * 9000번 포트로 들어오는 모든 연결 요청에 대해 응용프로그램에서 처리하겠다는 의미 */
    memset(&s_addr, 0, sizeof(s_addr));
    s_addr.sin_addr.s_addr =    htonl(INADDR_ANY);
    s_addr.sin_family =         AF_INET;
    s_addr.sin_port =           htons(PORT);

    /* 생성한 소켓을 해당 포트와 연결 */
    if(bind(s_socket, (struct sockaddr *) &s_addr, sizeof(s_addr)) == -1)
    {
        printf("Can not Bind\n");
        return -1;
    }

    /* 커널에 해당 소켓으로 통신이 이루어지도록 요청
     * 이 시점 이후로 해당 포트로 요청하는 연결을 받아들인다.*/
    if(listen(s_socket, 5) == -1)
    {
        printf("listen Fail\n");
        return -1;
    }

    /* 무한 루프 */
    while(1)
    {
        /* 클라이언트로 부터 연결 요청을 받아 들이는 코드
         * 전화 오기를 기다리다가 비로서 수화기를 들어 받는 단계 */
        len = sizeof(c_addr);
        c_socket = accept(s_socket, (struct sockaddr *) &c_addr, &len);
        
        /* 클라이언트와 연결된 연결 소켓(c_socket)으로 문자열 hello world를
         * 보낸다. */
        n = strlen(buffer);
        write(c_socket, buffer, n);

        /* 클라이언트에 연결된 연결 소켓(c_socket)을 끊고, 클라이언트로 부터 새로운
         * 연결 요청이 오기를 듣기 소켓(s_socket)을 이용하여 기다린다.*/
        close(c_socket);
    }
    close(c_socket);
        
    return 0;
}

사용된 주요 함수

  • 소켓을 생성
    • socket()
  • 연결 요청을 수신할 주소 설정
  • 소켓을 포트에 연결
    • blind()
  • 커널에 개통을 요청
    • listen()
  • 연결 요청을 수신
    • accept()
  • 클라이언트에게 서비스를 제공
    • read() / write()
  • 클라이언트와의 연결을 종료
    • close()

서버 프로그램만으로는 어떠한 결과 화면도 볼 순 없다. 다만 프로그램 자체는 정상적으로 소켓을 만들고 설정한 뒤 무한루프 안의 accept() 함수가 클라이언트의 연결 요청을 기다리고 있다.

아직 클라이언트 프로그램을 만들지 않았기 때문에 Telnet을 이용하여 간단하게 확인해 보았다. 서버가 잘 동작하는 것을 확인할 수 있다.

저작자 표시
신고

Hello World를 출력하는 소켓 프로그램의 구현[각주:1]

일반적으로 소켓 프로그램은 서비스를 요청하는 클라이언트측과 클라이언트로부터의 요청을 받아 서비스하는 서버측, 이렇게 두 곳에서 상주하는 프로그램으로 구성된다.





구현할 소켓 프로그램이 수행하는 기능을 정리하면 아래와 같다.

  1. 연결 요청

    • 클라이언트 프로그램은 소켓 API 함수를 호출하여 서버 프로그램에 연결.
  2. 문자열 전송
    • 연결 요청을 받은 서버 프로그램은 클라이언트 프로그램과 연결되자마자 문자열 "Hello World"를 클라이언트 측에 전송.
  3. 화면 출력
    • 클라이언트 프로그램은 전송받은 문자열(Hello World)을 자신의 화면에 출력한다.





저작자 표시
신고