이번 시간에는 유닉스소켓을 이용한 통신을 해보았다. 보통은 tcp/ip 를 이용한 통신을 하는데 자체 프로세서 끼리만 통신을 하기 위해서 unix소켓 통신을 하는것 같다.


//..............
int main()
{
int serverFd,clientFd,serverLen,clientLen,i;
struct sockaddr_un serverUNIXAddress;           // unix 소켓 통신시 사용하는 구조체
struct sockaddr_un clientUNIXAddress;
serverLen = sizeof(serverUNIXAddress);
clientLen = sizeof(clientUNIXAddress);
serverFd = socket(AF_UNIX,SOCK_STREAM,0)// AF_UNIX로 소켓을 연다.
serverUNIXAddress.sun_family = AF_UNIX;         // 구조체도 AF_UNIX로 설정
strcpy(serverUNIXAddress.sun_path,"Server");   // 그리고 sun_path 를 설정한다. 포트설정과 같은거.
unlink("Server");

//................
while(1)
{
if(fork() ==0)      // 자식을 프로세서를 생성 시켜 메세지를 보낸다.
{
  write(clientFd,"Socket Test",12);
  printf("send\n");
  close(clientFd);
  exit(0);
}
else
  close(clientFd);
}
return 0;
}
 



서버와 클라이언트를 각각 만들었다. 그리고 각각의 프로그램은 fork함수를 사용해서 부모 프로세스는 입력을 받아서 전송을 하는 역활이고 자식 프로세서는 받기민 할수있는 프로세스이다. 그리고 exit를 입력 하면 자식 통신은 종료가 된다. 간단한 프로그램이다.

그리고 readline함수는 키보드로 부터 값을 입력 받는 함수로서 컴파일 시에 목적 코드를 같이 link한다.

readline.c 파일


int readline(int fd,char *ptr,int maxlen)
{
    //.....
    for(n=1;n<maxlen;n++)
    {
        if((rc=read(fd,&c,1))==1)
        {
            *ptr++ = c;                  // 각각 ptr의 포인터에다 값을 저장 받는다.
            if( c=='\n') break;    // 엔터가 들어오면 입력을 중지 받는다.
        }
        else if(rc==0)    // 입력이 없으면 끝내는 쪽이다.
        {
            if(n==1) return 0;
            else break;
        }
    }
    *ptr=0;
    return n;                                // 몇 라인인지 리턴한다.
}
 




서버와 클라이언트 프로그램의 자식 프로세서를 이용한 메세지 주고 받기 처리

if((pid=fork())>0)    // 부모 프로세서로 여기서는 키를 입력 받는다.
    {
        while(readline(0,sendline,MAXLINE)!=0)
        {
            size=strlen(sendline);                                  // 사이즈를 받고
            if(write(client_fd,sendline,size)!=size)    // 클라이언트에게 명령을 전달한다.
            {
                printf("Server:fail in writing\n");
            }
            if(strncmp(sendline,escapechar,4)==0) // 만약 종료문자와같다면 종료한다.
            {
                kill(pid,SIGQUIT);                            // 자식 프로세서를 종료 시킴
                break;
            }
        }
    }
    else if(pid==0)   // 자식 프로세서로 여긴 메세지를 받는다.
    {
        while(1)            // 항상 대기 하고 있는다.
        {
            if((size=read(client_fd,rbuf,MAXLINE))>0)    // 만약 받은 메세지가 있다면
            {
                rbuf[size] = '\0';
                if(strncmp(rbuf,escapechar,4)==0)            // 종료문자가 들어오면
                {
                    kill(getppid(),SIGQUIT);            // 부모를 종료 시키고
                    break;                // 자식도 종료 시킨다.
                }
                printf(" %s",rbuf);                               // 내용을 출력하고
            }
        }
    }
 




일단 파일을 읽어 메모리로 읽어 들이는 것 까지 했다. 그 다음 전송할 차례이다. 음 잘 될련지..



비공개 글입니다. 아래 질문에 대한 답변을 입력해주세요.
Q:제가 요새 하는 psp타이틀 이름은?


패도라에서 APM을 설치 합니다.

yum 명령을 이용해서 Apache 웹 서버, PHP, MySQL 을 설치 해야 합니다.

rpm -qa | grep httpd

rpm -qa | grep php
rpm -qa | grep mysql

현재 설치 되있는 것을 찾습니다.

yum search 명령으로 각각의 패키지를 찾아 보겠습니다.

yum search httpd
yum search php
yum search mysql
yum search mysql-server
yum search php-mysql

yum search system-config-httpd
이렇게 한후

이 모든 패키지를 함께 설치합니다.

yum install httpd php mysql mysql-server php-mysql system-config-httpd

한후 웹 서버 데몬을 다시 시작 합니다.

/etc/rc.d/init.d/httpd start

리눅스 서버를 부팅함과 동시에 웹서비스를 시작할 수 있도록
활성화 합니다.

chkconfig --list | grep httpd
로 확인

chkconfig httpd on
chkconfig --list | grep httpd

이후 방화벽을 설정 합니다.

iptables -L로 확인 후

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

다시 확인
iptables -L로 확인

방화벽 다시 설정
/etc/rc.d/init.d/iptables save

호스트이름을 통해 접속하기 위해서는 squid를 중지 합니다.

chkconfig 를 통해 squid를 중지 시킵니다.

mysql 설정

/etc/rc.d/init.d/mysqld start로 시작하면 초기화가 됩니다.

초기화가 실행되면 이제 접근할수 있어야 하는데 이때 계정을 생성해 주어야 합니다.

mysqladmin -u root password '1234'

이제 실행

mysql -u root -p
비번

chkconfig 명령으로 mysqld를 활성화 합니다.

마지막으로 php와의 설정입니다.
php의 문서도 웹으로 서비스 할수 있게 해줍니다.

vi /etc/httpd/conf/httpd.conf
열고

DirectoryIndex index.php index.html index.htm
이것을 추가하고

AddType application/x-tar .tgz
AddType application/x-httpd-php .php .phtml .php3
AddType application/x-httpd-php-source .phps

위와 같이 하고 웹서버를 재시작 합니다.

그리고 제대로 동작 하는지 테스트용을 만듭니다.

vi /var/www/html/test.php
리눅스의 한글 입력기는 SCIM을 채택하였다.
이 입력기는 한글 변환시 Ctrl + Space 버튼을 기본 설정으로 하여 리눅스 사용자가 혼란을 가진다.

그리고 한/영 키가 바로 변환하지 않아서 상당히 불편하다.
이방법을 해결해 보기로 하자.

일단 루트로 접속한후

setkeycodes 명령을 통해 한영 키와 한자 키를 등록한다. 우리나라에서 일반적으로 사용되는 106키의
경우 한자 키와 한영 키에 사용되는 스캔 코드는 각각 71,72로 이키를 122,123으로 등록한다.
노트북과 같이 자판 배열이 일반과 다를 경우에는 스캔 코드가 다르므로 모델에 맞는 값을 입력 해야 한다.

setkeycodes 71 122
setkeycodes 72 123

showkey로 등록이 제대로 됐는지 확인해 보자
한자 , 한/영키를 확인해 보자~~

이제 부팅이 다시 될 시에도 적용하기 위해

/etc/rc.d/rc.local 에 위에 두코드를 입력하고

X 윈도우로 들어 간다.

그 다음 X윈도우에서 키값을 받는 프로그램인
xev를 실행 시켜 한자, 한/영 키코드를 찾고

vi /etc/X11/Xmodmap 에
다음과 같이 이름을 등록하자

keycode 209 = Hangul_Hanja
keycode 210 = Hangul

위와 같이 추가 하고

xmodmap /etc/X11/Xmodmap
다음과 같이 입력하여 재시작 하자

그런다음 SCIM설정에서 키코드 찾기를 누르고 한/영 키를 누르면 키가 등록되어 이제부터는
한글키로 한/영 변환이 가능하게 된다~~
리눅스 시스템에서 현재 쓰고 있는 윈도우의 파일시스템의 파일을 쓰고 싶은 경우가 간혹 생긴다.
이럴 경우에는 마운트란 것을 사용하여 마운트 할수 있다.

vfat의 경우

일단 디렉토리를 만들고

1. mkdir /mnt/c
2. mount -t vfat /dev/hda1 /mnt/c

하면 마운트 된다.

ntfs일 경우

ntfs의 경우 Microsoft 사에서 기술 공개를 하지 않았기 때문에 아직 읽기밖에 지원 되지 않는다.
그래서 커널 모듈을 인스톨 하여 사용하여야 한다.

1. uname -r
2. uname -m
으로 버전을 알아 내고

http://www.linux-ntfs.org <-- 사이트에 방문 커널에 맞는 패키지를 다운 한다.

3. rpm -Uvh kernet-mo......rpm 명령어로 패키지를 설치하고
4. modprobe ntfs 로 커널을 메모리에 올린다.
그리고
5. lsmod 로 확인해 본다.
6. mount -t ntfs /dev/hda1 /mnt/c 로 마운트 한다.

리눅스의 텍스트 콘솔 화면에서는 한글이 깨진 상태로 출력 된다.
그래서 무엇을 볼려고 하면 ㅁㅁㅁ 이렇게 나와서 안보는 것만 못하게 된다.
그럼 차라리 영어로 바꾸면 간단히나마 알수 있을 것이 아닌가

해결책

콘솔 모드 영어로
export LANG=en_US

콘솔 모드 한글로
export LANG=ko_KR.UTF_8

위와 같은 방법으로 하면 해결 할수 있으나 하나하나 하기는 힘들다
그렇다면 MS-Dos에서 자동으로 실행되는 환경 설정 파일 autoexec.bat과 config.sys처럼
리눅스에서도 자동 실행 되는 파일을 설정으로 간단히 할수 있다.

vi /root/.bashrs

와 같이 하고 alias를 설정한다.

alias en='export LANG=en_US'
alias en='export LANG=ko_KR.UTF-8'

이렇게 하면

div>