이번 시간에는 유닉스소켓을 이용한 통신을 해보았다. 보통은 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타이틀 이름은?



div>