pre fork ¼­¹ö¿¡¼­ÀÇ ¼ÒÄÏ Àü´Þ.
ÃÑ ÆäÀÌÁö ¼ö : 3224

Àüü ÇÔ¼ö/¿ë¾î»çÀü
Facebook Joinc ±×·ì   Joinc QA »çÀÌÆ®
ÇöÀçÀ§Ä¡ : article>socket_transmission



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

¼Ò°³

fork()´Â »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½Ã۱â À§Çؼ­ »ç¿ëÇÏ´Â ½Ã½ºÅÛÄݷΠƯÈ÷ ´ÙÁßÀÇ Å¬¶óÀÌ¾ðÆ®¿Í Åë½ÅÀ» ÇØ¾ß ÇÏ´Â ¼­¹öÇÁ·Î±×·¥ÀÇ ÀÛ¼ºÀ» À§Çؼ­ ¾²·¹µå¿Í ÇÔ²² ÀϹÝÀûÀ¸·Î »ç¿ëµÈ´Ù.

ÀÎÅÍ³Ý È¯°æÀÇ ¹ß´Þ·Î ÀÎÇØ¼­ ÃÖ±ÙÀÇ ¼­¹ö ÇÁ·Î±×·¥µéÀº °¡´ÉÇÑÇÑ È¿À²ÀûÀ¸·Î ÃÖ¼ÒÀÇ ºñ¿ë¸¸À» ¼ÒºñÇϸ鼭 ƯÁ¤ÇÑ ÀÏÀ» ó¸®ÇؾßÇÒ Çʿ䰡 ÀÖ´Ù. ÀϹÝÀûÀ¸·Î fork()¸¦ È£ÃâÇØ¼­ »õ·Î¿î ÇÁ·Î¼¼½º¸¦ »ý¼º½ÃŰ°Å³ª pthread_create()µîÀ» ÀÌ¿ëÇØ¼­ »õ·Î¿î ¾²·¹µå¸¦ »ý¼º½ÃŰ´Â °Ç ¸Å¿ì ¸¹Àº ÀÚ¿ø°ú ½Ã°£À» ¼Ò¸ðÇÑ´Ù. ±×·¯¹Ç·Î °¡´ÉÇϸé ÀÌµé ½Ã°£À» ÁÙ¿©¾ßÇÒ Çʿ䰡 ÀÖ´Ù.

ÀÌ·± ÀÌÀ¯·Î ¾²·¹µå ȤÀº ÇÁ·Î¼¼½º¸¦ ¹Ì¸® »ý¼º½ÃÄѼ­ ÇÊ¿äÇÒ ¶§ ÀÛ¾÷À» ÇÒ´ç ½ÃŰ´Â ¹æ¹ýÀ» »ç¿ëÇÏ°Ô µÈ´Ù. ¾²·¹µå¸¦ ¹Ì¸® »ý¼º½ÃÄѼ­ È¿À²À» ³ôÀÌ´Â ¹æ¹ýÀº ÀÌ¹Ì ¾²·¹µå Ç®ÀÛ¼º¿¡¼­ ´Ù·éÀûÀÌ ÀÖ´Ù.

¿©±â¿¡¼­´Â ÇÁ·Î¼¼½º Ç®À» ¸¸µé¾î¼­ È¿À²¼ºÀ» ³ôÀÎ ¼­¹öÇÁ·Î±×·¥ÀÇ ÀÛ¼º ±â¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ.

ÇÁ·Î¼¼½º Ç®ÀÇ ÀÛ¼º

±âº»ÀûÀÎ °³³äÀº ¾²·¹µå Ç®°ú °°´Ù. ºÎ¸ð ¾²·¹µå´Â ¿ì¼± ÇÊ¿äÇÑ ¸¸Å­ÀÇ ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ¹Ì¸® ÇÒ´ç ½ÃÄÑ ³õ´Â´Ù. ºÎ¸ð ¾²·¹µå´Â socket()->bind()->listen() À¸·Î »ý¼ºµÈ µè±â ¼ÒÄÏÀ» ÅëÇÏ¿© Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀ» ±â´Ù¸°´Ù. ¸¸¾à Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°áÀÌ ¹ß»ýÇÑ´Ù¸é ºÎ¸ð ¼ÒÄÏÀº ³î°í ÀÖ´Â ÀÚ½Ä ÇÁ·Î¼¼½º°¡ Ŭ¶óÀÌ¾ðÆ®¸¦ ó¸®Çϵµ·Ï ó¸®ÇÑ´Ù.

±×·±µ¥ ÇÁ·Î¼¼½º Ç®ÀÇ °æ¿ì ¾²·¹µå Ç®¿¡¼­´Â °ÞÀ» ¼ö ¾ø¾ú´ø "¼ÒÄÏ Àü´Þ"°ú °ü·ÃµÈ ¹®Á¦¿¡ Á÷¸éÇÏ°Ô µÈ´Ù. ¾²·¹µåÀÇ °æ¿ì¶ó¸é ºÎ¸ð ÇÁ·Î¼¼½º¿Í ÀÚ½Ä ÇÁ·Î¼¼½º°£ÀÇ ÆÄÀÏÀÌ °øÀ¯ µÇ¹Ç·Î ÇÁ·Î±×·¡¸Ó´Â ´ÜÁö ³î°í ÀÖ´Â ¾²·¹µå¸¦ ±ú¿ì°í "¾î¶² ¿¬°á ¼ÒÄÏ"À» ÅëÇØ¼­ Åë½ÅÇÏ¸é µÉÁö¸¦ ÀÚ½Ä ¾²·¹µå¿¡°Ô ¾Ë·ÁÁֱ⸸ ÇϸéµÈ´Ù.

±×·¯³ª ÀüÇô º°°³ÀÇ ÇÁ·Î¼¼½º·Î ±¸¼ºµÇ´Â ÇÁ·Î¼¼½º Ç®¿¡¼­´Â ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. ÀÏ´Ü fork()¸¦ ÅëÇØ¼­ »õ·Î¿î ÇÁ·Î¼¼½º°¡ ¸¸µé¾î Á³´Ù¸é À̵éÀº ¼­·Î ÀüÇô ¹ú°³ÀÇ µ¶¸³µÈ ÆÄÀÏÀ» °¡Áö°í ÀÛ¾÷Çϱ⠶§¹®ÀÌ´Ù. ºÎ¸ð ÇÁ·Î¼¼½º´Â ¾î¶±Çؼ­µçÁö »õ·Î »ý¼ºµÈ ¼ÒÄÏÀ» ÀڽĿ¡°Ô Àü´ÞÇØ ÁÖ¾î¾ß ÇÏ´Â ¹®Á¦¸¦ ÇØ°áÇØ¾ß ÇÑ´Ù.

¼ÒÄÏ Àü´Þ

¼ÒÄÏ Àü´ÞÀ» À§Çؼ­ »ç¿ëÇÒ ±âº» Å×½ºÆ® ¼­¹ö ÄÚµå
#include <sys/stat.h> 
#include <sys/socket.h> 
#include <signal.h> 
#include <unistd.h> 
#include <netinet/in.h> 
#include <arpa/inet.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; 
    int pid; 
 
    struct sockaddr_in clientaddr, serveraddr, myaddr; 
    char buf[256] = {0x00,}; 
 
 
    // internet ±â¹ÝÀÇ ½ºÆ®¸² ¼ÒÄÏÀ» ¸¸µéµµ·Ï ÇÑ´Ù.  
    // server_sockfd ´Â endpoint ¼ÒÄÏ(µè±â ¼ÒÄÏ) À¸·Î »ç¿ëµÈ´Ù.  
    if ((server_sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
        perror("socket error : "); 
        exit(0); 
    } 
    bzero(&serveraddr, sizeof(serveraddr)); 
    serveraddr.sin_family = AF_INET; 
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serveraddr.sin_port = htons(12345); 
 
    // µè±â ¼ÒÄÏ¿¡ ¼ÒÄÏÆ¯¼º(ÁÖ¼Ò, Æ÷Æ®)¸¦ ¹­¾îÁØ´Ù.  
    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); 
    } 
 
    // ¸¸¾à µè±â ¼ÒÄÏÀ¸·Î Ŭ¶óÀÌ¾ðÆ® ¿¬°áÀÌ µé¾î¿Ô´Ù¸é,  
    // »õ·Î¿î Ŭ¶óÀÌ¾ðÆ®¿ÍÀÇ Åë½ÅÀ» À§ÇÑ ¼ÒÄÏ ÁöÁ¤¹øÈ£¸¦ ÇÒ´çÇÑ´Ù.  
    signal(SIGCHLD, SIG_IGN); 
    while(1) 
    { 
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr,  
                           &client_len); 
        if (client_sockfd == -1) 
        { 
            perror("Accept error : "); 
            exit(0); 
        } 
        pid = fork(); 
        if (pid == 0) 
        { 
            read(client_sockfd, buf, 256); 
            printf("%s\n", buf); 
 
            sleep(1); 
            printf("Child Close\n"); 
            close(client_sockfd); 
            exit(0); 
        } 
    } 
    close(client_sockfd); 
    return 1; 
} 
 
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.