Unix Domain Socket
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®



joinc´Â Firefox¿Í chrome¿¡¼­ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼­´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù.

Unix Domain Socket(ÀÌÇÏ UDS) ´Â socket API¸¦ ¼öÁ¤¾øÀÌ ÀÌ¿ë¸ç, port ±â¹ÝÀÇ Inernet Domain Socket¿¡ ºñÇØ¼­ ·ÎÄà ½Ã½ºÅÛÀÇ ÆÄÀϽýºÅÛÀ» ÀÌ¿ëÇØ¼­ ³»ºÎÇÁ·Î¼¼½º°£ÀÇ Åë½ÅÀ» À§ÇØ »ç¿ëÇÑ´Ù´Â Á¡ÀÌ ´Ù¸£´Ù°í ÇÒ¼ö ÀÖ´Ù.

ls ¸¦ ÀÌ¿ëÇØ¼­ Åë½ÅÀ» À§Çؼ­ ¸¸µé¾îÁø ÆÄÀÏÀ» º¸¸é ´ÙÀ½°ú °°Àº ¸ð½ÀÀ» º¸ÀδÙ.
[yundream@localhost tmp]$ ls -al
srwx------    1 root     nobody          0 12¿ù 14 21:16 .fam_socket
º¸¸é ÆÄÀÏŸÀÔ¿¡ "s" °¡ ºÙ¾î ÀÖ´Â°É ¾Ë¼ö ÀÖÀ¸¸ç, ÆÄÀÏ»çÀÌÁî°¡ 0À¸·Î µÇ¾î ÀÖ´Â °É ¾Ë¼ö ÀÖ´Ù. ¿Ö³ÄÇϸé FIFO¿Í ¸¶Âù°¡Áö·Î ¸Þ½ÃÁö°¡ ÆÄÀÏ·Î ½×ÀÌÁö ¾Ê°í Ä¿³Î·Î Àü´ÞµÇ¾î¼­ Ä¿³Î¿¡¼­ ó¸®Çϱ⠶§¹®ÀÌ´Ù.

ÆÄÀÏÀ» ÅëÇØ¼­ Åë½ÅÀ» Çϸç, Ä¿³Î³»ºÎ¿¡¼­ ¸Þ½ÃÁö¸¦ °ü¸®ÇÑ´Ù´Â Á¡¿¡¼­ FIFO¿Í ¸Å¿ì À¯»çÇѸéÀ» º¸¿©ÁÖÁö¸¸, FIFO¿Í´Â ´Þ¸® ¾ç¹æÇâ Åë½ÅÀÌ °¡´ÉÇϴٴ Ư¡À» °¡Áö°í ÀÖ´Ù. ±×·¯¹Ç·Î ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¸¦ ¹Þ¾ÆµéÀÌ´Â ¼­¹ö/Ŭ¶óÀÌ¾ðÆ® ¸ðµ¨À» ¸¸µé±â°¡ ¸Å¿ì ½±´Ù.
¶ÇÇÑ Inet ¼ÒÄÏÀ» ÅëÇÑ ¿ÜºÎÅë½Å¿¡ ºñÇØ¼­ 2¹è ÀÌ»óÀÇ È¿À²À» º¸¿©ÁØ´Ù¶ó´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

¸¹Àº °æ¿ì ¾à°£ º¹ÀâÇÑ ³»ºÎÇÁ·Î¼¼½º°£ Åë½ÅÀ» ÇØ¾ßµÈ´Ù°í ÇßÀ»¶§ UDSÀ» ¸¹ÀÌ »ç¿ëÇÑ´Ù. INET °èÃþ¿¡¼­ÀÇ Åë½ÅÀÌ TCP/IP 4°èÃþÀ» ¸ðµÎ °ÅÄ¡´Â°Í°ú´Â ´Ù¸£°Ô, UDS Àº ¾îÇø®ÄÉÀÌ¼Ç °èÃþ¿¡¼­ TCP °èÃþ±îÁö¸¸ ¸Þ½ÃÁö°¡ Àü´ÞµÇ°í, ´Ù½Ã °ð¹Ù·Î ¾îÇø®ÄÉÀÌ¼Ç °èÃþÀ¸·Î ¸Þ½ÃÁö°¡ ¿Ã¶ó°¡°Ô µÈ´Ù. TCP/IP °èÃþ¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº TCP/IP °³¿ä(2)¸¦ Âü°í Çϱ⠹ٶõ´Ù.

À§¿¡¼­ INET ¼ÒÄϺ¸´Ù 2¹èÀÌ»óÀÇ È¿À²À» °¡Áø´Ù°í Çߴµ¥, 4°èÃþÀÇ ·¹À̾ ¸ðµÎ °ÅÃľßÇÏ´Â INET ¼ÒÄÏ¿¡ ºñÇØ¼­ ´ÜÁö 2°³ÀÇ ·¹À̾ »ç¿ëÇÑ´Ù´Â Á¡µµ ±× ÀÌÀ¯Áß Çϳª·Î ÀÛ¿ëÇÑ´Ù.

½î¾² ÄÚµå´Â ´ÙÁß¿¬°á¼­¹ö ¸¸µé±â(1)ÀÇ zipcode_multi.c ¿Í ¼ÀÇ÷Π¾Ë¾Æº¸´Â ¼ÒÄÏÇÁ·Î±×·¡¹Ö(1)ÀÇ zipcode_cli.c ¸¦ »ç¿ëÇϵµ·ÏÇÒ°ÍÀÌ´Ù.

¿¹Á¦: zipcode_local.c
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/socket.h> 
#include <sys/un.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char **argv)
{
    int server_sockfd, client_sockfd;
    int state, client_len;
    pid_t pid;

    FILE *fp;
    struct sockaddr_un clientaddr, serveraddr;

    char buf[255];
    char line[255];

    if (argc != 2)
    {
        printf("Usage : ./zipcode [file_name]\n");
        printf("¿¹    : ./zipcode /tmp/mysocket\n"); 
        exit(0);
    }

    memset(line, '0', 255);
    state = 0;

    if (access(argv[1], F_OK) == 0)
    {
        unlink(argv[1]);
    }
    // ÁÖ¼Ò ÆÄÀÏÀ» ÀоîµéÀδÙ. 
    client_len = sizeof(clientaddr);
    if((fp = fopen("zipcode.txt", "r")) == NULL)
    {
        perror("file open error : ");
        exit(0);
    }

    // internet ±â¹ÝÀÇ ½ºÆ®¸² ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù. 
    if ((server_sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error : ");
        exit(0);
    }
    bzero(&serveraddr, sizeof(serveraddr));
    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, argv[1]);


    state = bind(server_sockfd , (struct sockaddr *)&serveraddr, 
            sizeof(serveraddr));
    if (state == -1)
    {
        perror("bind error : ");
        exit(0);
    }

    state = listen(server_sockfd, 5);
    if (state == -1)
    {
        perror("listen error : ");
        exit(0);
    }


    printf("accept : \n");
    while(1)
    {
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, 
                               &client_len);
        printf("test test\n");
        pid = fork();
        if (pid == 0)
        {
            if (client_sockfd == -1)
            {
                perror("Accept error : ");
                exit(0);
            }
            while(1)
            {
                memset(buf, '0', 255);
                if (read(client_sockfd, buf, 255) <= 0)
                {
                    close(client_sockfd);
                    fclose(fp);
                    exit(0);
                }

                if (strncmp(buf, "quit",4) == 0)
                {
                    write(client_sockfd, "bye bye\n", 8);  
                    close(client_sockfd);
                    fclose(fp);
                    break;
                }

                while(fgets(line,255,fp) != NULL)
                {
                    if (strstr(line, buf) != NULL)
                        write(client_sockfd, line, 255);
                    memset(line, '0', 255);
                }
                write(client_sockfd, "end", 255);
                printf("send end\n");
                rewind(fp);
            }
        }
    }
    close(client_sockfd);
}


´ÙÀ½Àº Ŭ¶óÀÌ¾ðÆ® ÇÁ·Î±×·¥ÀÌ´Ù.
¿¹Á¦: zipcode_cli_local.c
#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/socket.h> 
#include <unistd.h> 
#include <sys/un.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 


int main(int argc, char **argv)
{

    int client_len;
    int client_sockfd;

    FILE *fp_in;
    char buf_in[255];
    char buf_get[255];

    struct sockaddr_un clientaddr;

    if (argc != 2)
    {       
        printf("Usage : ./zipcode_cl [file_name]\n");
        printf("¿¹    : ./zipcode_cl /tmp/mysocket\n");
        exit(0);
    }       


    client_sockfd = socket(AF_UNIX, SOCK_STREAM, 0);
    if (client_sockfd == -1)
    {
        perror("error : ");
        exit(0);
    }
    bzero(&clientaddr, sizeof(clientaddr));
    clientaddr.sun_family = AF_UNIX;
    strcpy(clientaddr.sun_path, argv[1]);
    client_len = sizeof(clientaddr);
    if (connect(client_sockfd, (struct sockaddr *)&clientaddr, client_len) < 0)
    {
        perror("Connect error: ");
        exit(0);
    }
    while(1)
    {
        printf("Áö¿ªÀ̸§ ÀÔ·Â : ");
        fgets(buf_in, 255,stdin);

        buf_in[strlen(buf_in) - 1] = '0';
        write(client_sockfd, buf_in, 255);
        if (strncmp(buf_in, "quit", 4) == 0)
        {
            close(client_sockfd);
            exit(0);
        }
        while(1)
        {
            read(client_sockfd, buf_get, 255); 
            if (strncmp(buf_get, "end", 3) == 0)
                break;

            printf("%s", buf_get);
        }
    }

    close(client_sockfd);
    exit(0);
}


±âÁ¸ÀÇ INET ¹öÁ¯ÀÇ ÇÁ·Î±×·¥°ú ºñ±³ÇØ º¸¸é °íÀÛ 3ÁÙ Á¤µµ¸¸ ¼öÁ¤µÇ¾úÀ½À» ¾Ë¼ö ÀÖÀ»°ÍÀÌ´Ù. ´ÜÁö ¼ÒÄÏ ±¸Á¶Ã¼°¡ sockaddr_un À¸·Î ¹Ù²î°í, AF_INET ´ë½Å AF_UNIX ¸¦ ±×¸®°í port ¹øÈ£´ë½Å¿¡ ÆÄÀϸíÀ» »ç¿ëÇßÀ½À» ¾Ë¼ö ÀÖ´Ù.

³ª¸ÓÁöÀÇ ¸ðµç ÄÚµå´Â INET ÄÚµå¿Í ¿ÏÀüÈ÷ °°´Ù. ±×·¯¹Ç·Î Unix Domain Socket ¸¦ »ç¿ëÇϸé Inet Domain Socket ¿Í ÄÚµå Àϰü¼ºÀ» À¯ÁöÇÒ¼ö ÀÖÀ¸¸ç, µ¿ÀÏÇÑ ±â¼úÀ» »ç¿ëÇØ¼­ ÇÁ·Î±×·¡¹ÖÀ» ÇÒ¼ö ÀÖ´Ù.

¶ÇÇÑ ´Ù¸¥ ´ëºÎºÐÀÇ IPC ¼³ºñµéÀÌ, ¹ü¿ëÀûÀ¸·Î »ç¿ëÇϱ⿡´Â ºÎÁ·ÇÑ ¿©·¯°¡Áö ´ÜÁ¡µéÀ» °¡Áø¹Ý¸é(´Ü¹æÇâ À̰ųª, Àб⸸ °¡´ÉÇϴٰųª, Á¦¾îÇϱⰡ ¾î·Á¿î) UDS´Â ¸Å¿ì ¹ü¿ëÀûÀÎ IPC ·Î½á »ç¿ë°¡´ÉÇÏ´Ù¶ó´Â ÀåÁ¡À» °¡Áö°í ÀÖ´Ù.

½ÇÁ¦·Î X ¼­¹ö °°Àº°æ¿ì¿¡ ¿ÜºÎ¿¡¼­ÀÇ Á¢±Ù½Ã¿¡´Â INET ¿¬°áÀ» ³»ºÎ¿¡¼­ÀÇ ¿¬°áÀ» À§Çؼ­´Â UDS ¸¦ »ç¿ëÇÑ´Ù. À̹ۿ¡µµ mysql, pgsql, KDE, Gnome °ú °°Àº ´ëºÎºÐÀÇ ¼­¹öÇÁ·Î±×·¥ÀÌ ³»ºÎÅë½ÅÀ» À§Çؼ­ UDS ¸¦ »ç¿ëÇÑ´Ù.
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.