2010년 2월 6일 토요일

[TIP!]windows에서 linux의 하드 링크기능 사용하기

리눅스의 심볼릭 링크는 윈도우의 바로가기와는 다르게 파일명만 다르고 같은 위치의 데이터를 참조한다.


윈도우에서도 심볼릭 링크와 하드링크라는 기능이 있다.


심볼릭은 파일에 대한 링크이고

하드링크는 실제로 그곳의 데이터에 대한 링크이다.


예를들면 심볼릭의 경우 원본을 지우면 링크가 깨지지만 하드링크의 경우 원본이 삭제되어도,

그곳의 데이터를 참조하는 파일이 있기때문에 하드디스크에서 데이터가 지워지지 않는다. 그래서
하드링크된 파일을 불러올수 있다.


개념을 알았다면 실제로 작성해 보자.


WinXP


x:\TEST>fsutil hardlink create 링크이름 원본이름 (하드링크)


WinVista이상


x:\TEST>mklink /h 링크이름 원본이름 (하드링크)

x:\TEST>mklink /d 링크이름 원본이름 (디렉터리링크)

x:\TEST>mklink 링크이름 원본이름 (심볼릭링크)

2010년 2월 4일 목요일

소켓 프로그래밍의 기초(2)

아래 내용들은 윤성우 저자의 "지피지기 TCP/IP소켓 프로그래밍" 책의 내용을 바탕으로 본인이 읽고 새로 정리한 내용들이니,
다소의 오류가 있을 수도 있습니다.


서버 소켓 기본 코드
[code cpp]
/*
* helloWorld_server.c
* Written by SW.YOON
* Edited by Michael YOON
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

#define default_PT 89123

void error_handling(char *message);

int main(int argc, char ** argv)
{
    int serv_sock;
    int clnt_sock;
    struct sockaddr_in serv_addr;
    struct sockaddr_in clnt_addr;
    int clnt_addr_size;
    char message[]="Hello World!\n";

    if(argc>1)
    {
        printf("Usage : %s <port>\n" ,argv[0]);    //사용법
        printf("Default port is 89123\n");
    }
////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////기본 소켓 생성 설정/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    serv_sock=socket(PF_INET, SOCK_STREAM,0);    //서버소켓 만들기
                                //PF_INET은

    if(serv_sock == -1)
        error_handling("socket() error");        //서버소켓 만들기 실패 시

    memset(&serv_addr,0,sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    if(argc==2)
    {
        serv_addr.sin_port = htons( atoi(argv[1]) );
    }
    else
    {
        serv_addr.sin_port = htons( atoi(default_PT) );
    }

    if( bind( serv_sock, (struct sockaddr* )&serv_addr, sizeof(serv_addr) ) == -1 )
    {
        error_handling("bind() error");
    }

    if( listen(serv_sock,5) == -1 )
    {
        error_handling("listen() error");
    }
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
    clnt_addr_size = sizeof(clnt_addr);
    clnt_sock=accept( serv_sock, (struct sockaddr*) &clnt_addr, &clnt_addr_size );
                                /* 연결 수락 */
    if(clnt_sock == -1)
        error_handling("accept() error");    write( clnt_sock, message, sizeof(message) );        /* 데이터 전송 */
    close(clnt_sock);                        /* 연결 종료 */
    return 0;
}

void error_handling(char *message)
{
    fputs( message, stderr );
    fputc( '\n', stderr);
    exit(1);
}

[/code]

기본 연결포트는 89123포트로 설정해 놓았습니다.

우선 하나하나 코드를 살펴보면


17줄. 에러 핸들러를 선언합니다.


21줄. 서버소켓을 선언합니다.


22줄. 클라이언트 소켓을 선언합니다.


23줄. 서버의 IPv4주소체계를 기록하는 구조체이다.


24줄. 클라이언트의 IPv4주소체계를 기록하는 구조체이다.


25줄. 클라이언트 IPv4 주소 구조체의 크기를 기록하는 구조체이다.


26줄. 간단히 Hello World! 문자열을 출력하기 위한 문자배열이다.


28~32줄. 인자의 개수를 파악하여 사용법을 알려주기도 한다.


36줄. 서버소켓을 생성한다.


42~52줄에서는 서버주소체계를 설정하고 있다.


54줄. bind함수로 소켓과 인터넷 주소를 이어준다..


59줄, listen함수.




66줄.




67줄. accept함수!!



69~70줄. 여기는 간단히 에러처리 부분이다.




71. 여기서는 write 함수를 이용, message를 전송한다.


72줄. 클라이언트 소켓을 닫는다

소켓 프로그래밍의 기초(1)

아래 내용들은 윤성우 저자의 "지피지기 TCP/IP소켓 프로그래밍" 책의 내용을 바탕으로 본인이 읽고 새로 정리한 내용들이니,
다소의 오류가 있을 수도 있습니다.

   

  1. 소켓의 이해.
    1. 서버프로그램.
      서버프로그램의 작동은 크게 x가지 과정으로 나뉜다.
      1. 소켓 생성
        int socket(int domain, int type, int protocol);
        함수를 이용해 소켓을 생성한다.
        (헤더 "sys/type.h", "sys/socket.h")
      2. 소켓 바인딩
        int bind(int sockfd, struct sockaddr *myaddr, int addrlen);
        함수를 이용하여 소켓에 주소 및 포트를 할당한다.
      3. 리스닝
        int listen(int sockfd, int backlog);
        함수를 이용하여 소켓에 연결이 준비한다.
      4. 엑셉트
        int accept(int sockfd, struct sockaddr *addr, int *addrlen);
        함수를 이용하여 클라이언트와 연결한다.
    2. 클라이언트 프로그램.
      클라이언트 소켓의 작동은 크게 x가지 과정으로 나뉜다.
      1. 소켓 생성
      2. 컨넥트
        int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
        함수를 이용하여 서버와 연결한다.