select¸¦ ÀÌ¿ëÇÑ ´ÙÁß¿¬°á ó¸® ¼­¹ö ÀÛ¼º
ÃÑ ÆäÀÌÁö ¼ö : 3224

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



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

Contents

1 ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ëÇÑ ´ÙÁß¿¬°áó¸® ¼­¹ö Á¦ÀÛ
2 ¸ð¾Æ¼­ ó¸®Çϱâ
3 ºñºÀ¼â ÀÔÃâ·Â Àû¿ë

1 ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ëÇÑ ´ÙÁß¿¬°áó¸® ¼­¹ö Á¦ÀÛ

¿ì¸®´Â ¸ÖƼ ÇÁ·Î¼¼½º ±â¹Ý ´ÙÁß Å¬¶óÀÌ¾ðÆ® Ã³¸® ÇÁ·Î±×·¥À» ¾Ë¾Æº¸¾Ò´Ù. À̹ø¿¡´Â ÀÔÃâ·Â ´ÙÁßÈ­¸¦ ÀÌ¿ë, ´Ù¼öÀÇ ¿¬°áÀ» ó¸®ÇÏ´Â ¼ÒÄÏ ¼­¹ö ÇÁ·Î±×·¡¹Ö ±â¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸µµ·Ï ÇϰڴÙ. ¸ÕÀú ÆÄÀÏ ÀÔÃâ·Â ´ÙÁßÈ­¹®¼­¸¦ ÀÐ¾î º¸±â ¹Ù¶õ´Ù.

select(2) ¸¦ ÅëÇØ¼­ ´ÙÁß¿¬°á¼­¹ö¸¦ ¸¸µé°æ¿ì fork(2)¸¦ ÀÌ¿ëÇÑ ¸ÖƼ ÇÁ·Î¼¼½º¿¡ ºñÇØ¼­ ¸î°¡Áö ÀåÁ¡ÀÌ ÀÖ´Ù. ÇÁ·Î¼¼½º »ý¼ºÀº ¸Å¿ì ¸¹Àº ºñ¿ëÀ̵ç´Ù. ÀÔÃâ·Â ´ÙÁßÈ­´Â ÇÁ·Î¼¼½º »ý¼ººñ¿ëÀ» ÁÙÀÏ ¼ö ÀÖ´Ù. ¸ÖƼ ÇÁ·Î¼¼½º ¹æ½Ä ÇÁ·Î±×·¥ÀÇ °æ¿ì µ¶¸³µÈ ÇÁ·Î¼¼½º·Î ½ÇÇàµÇ¹Ç·Î ÇÁ·Î¼¼½º°£ Åë½ÅÀ» À§Çؼ­ IPC¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. IPC´Â Á¦¾îÇϱ⠱î´Ù·Ó±â·Î À¯¸íÇÏ´Ù. select ·Î ±¸¼ºÇÒ°æ¿ì ´ÜÀÏÇÁ·Î¼¼½º·Î ¸ðµç ÀÛ¾÷ÀÌ ÀÌ·ç¾îÁö¹Ç·Î ±»ÀÌ IPC¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù¶ó´Â Á¡ÀÌ´Ù.

selectÀÇ ´ÜÁ¡Àº ÆÄÀÏ ÀÔÃâ·Â ´ÙÁßÈ­¹®¼­¸¦ Âü°íÇϱ⠹ٶõ´Ù. ¼ÒÄÏ ³×Æ®¿öÅ© ÇÁ·Î±×·¥¿¡¼­µµ fd_setÀ» ¸Å¹ø º¹»çÇØ¾ß Çϸç, Àüü fd_setÀ» ¸ðµÎ ¼øÈ¯ÇØ¾ß ÇÏ´Â ¹®Á¦¸¦ °¡Áø´Ù. epollÀ» ÀÌ¿ëÇϸé ÀÔÃâ·Â ´ÙÁßÈ­ÀÇ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù.

±×·³ fork ¹öÁ¯ÀÇ ¼­¹ö¸¦ select ¹öÁ¯À¸·Î ÀçÀÛ¼ºÇغ¸µµ·Ï ÇÏÀÚ. Ŭ¶óÀÌ¾ðÆ®´Â ±âÁ¸ÀÇ °ÍÀ» ¼öÁ¤ÇÏÁö ¾Ê°í ¾²µµ·Ï ÇÑ´Ù. ÀüÇüÀûÀÎ ¿¡ÄÚ ¼­¹ö´Ù.
#include <sys/time.h> 
#include <sys/types.h> 
#include <unistd.h> 
 
#include <sys/socket.h> 
#include <sys/types.h> 
 
#include <netinet/in.h> 
#include <arpa/inet.h> 
 
#include <stdio.h> 
#include <string.h> 
 
#define MAXLINE 1024  
#define PORTNUM 3600 
#define SOCK_SETSIZE 1021 
 
int main(int argc, char **argv) 
{ 
    int listen_fd, client_fd; 
    socklen_t addrlen; 
    int fd_num; 
    int maxfd = 0; 
    int sockfd; 
    int readn; 
    int i= 0; 
    char buf[MAXLINE]; 
    fd_set readfds, allfds; 
 
    struct sockaddr_in server_addr, client_addr; 
 
    if((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) 
    { 
        perror("socket error"); 
        return 1; 
    }    
    memset((void *)&server_addr, 0x00, sizeof(server_addr)); 
    server_addr.sin_family = AF_INET; 
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY); 
    server_addr.sin_port = htons(PORTNUM); 
     
    if(bind(listen_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) 
    { 
        perror("bind error"); 
        return 1; 
    }    
    if(listen(listen_fd, 5) == -1) 
    { 
        perror("listen error"); 
        return 1; 
    }    
     
    FD_ZERO(&readfds); 
    FD_SET(listen_fd, &readfds); 
 
    maxfd = listen_fd; 
    while(1) 
    { 
        allfds = readfds; 
        printf("Select Wait %d\n", maxfd); 
        fd_num = select(maxfd + 1 , &allfds, (fd_set *)0, 
                      (fd_set *)0, NULL); 
 
        if (FD_ISSET(listen_fd, &allfds)) 
        { 
            addrlen = sizeof(client_addr); 
            client_fd = accept(listen_fd, 
                    (struct sockaddr *)&client_addr, &addrlen); 
 
            FD_SET(client_fd,&readfds); 
 
            if (client_fd > maxfd) 
                maxfd = client_fd; 
            printf("Accept OK\n"); 
            continue; 
        } 
 
        for (i = 0; i <= maxfd; i++) 
        { 
            sockfd = i; 
            if (FD_ISSET(sockfd, &allfds)) 
            { 
                if( (readn = read(sockfd, buf, MAXLINE-1)) == 0) 
                { 
                    printf("close\n"); 
                    close(sockfd); 
                    FD_CLR(sockfd, &readfds); 
                } 
                else 
                { 
                    buf[readn] = '\0'; 
                    write(sockfd, buf, strlen(buf)); 
                } 
                if (--fd_num <= 0) 
                    break; 
            } 
        } 
    } 
} 
 

2 ¸ð¾Æ¼­ ó¸®Çϱâ

select´Â ¼ÒÄÏ ¹öÆÛ¿¡ µ¥ÀÌÅͰ¡ ³²¾Æ ÀÖÀ¸¸é fd_setÀ» 1·Î µÐ´Ù. ±×·¯¹Ç·Î read ÇÔ¼ö·Î ¼ÒÄÏ ¹öÆÛ¸¦ ºñ¿ìÁö ¸øÇϸé, ¿©·¯ ¹ø select¸¦ È£ÃâÇÏ°Ô µÈ´Ù. MAXLINEÀÇ Å©±â¸¦ ÀÛ°Ô ÇÑ ´ÙÀ½ Å×½ºÆ® ÇØº¸±â ¹Ù¶õ´Ù. select¸¦ ¿©·¯¹ø È£ÃâÇÏ´Â °ÍÀº ±×´ÙÁö ÁÁÀº ¹æ¹ýÀº ¾Æ´Ï´Ù. Â÷¶ó¸® ¹öÆÛ¿¡ ÀÖ´Â ³»¿ëÀ» ´Ù °¡Á®¿Ã ¶§±îÁö read¸¦ È£ÃâÇÏ´Â°Ô ´õ ³ªÀ» °ÍÀÌ´Ù.
while( (readn = read(sockfd, buf, MAXLINE-1)) > 0) 
{ 
    write(sockfd, buf, readn); 
} 
 
±×·¯³ª ÀÌ ¹æ¹ýÀº ¹öÆÛ¸¦ ºñ¿ì°í ³ª¼­, read¿¡¼­ ºÀ¼âµÇ¾î¹ö¸°´Ù´Â ¹®Á¦°¡ ÀÖ´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­´Â ¼ÒÄÏÀ» ºñºÀ¼â·Î ÇØ¾ß ÇÑ´Ù.

3 ºñºÀ¼â ÀÔÃâ·Â Àû¿ë

¸ð¾Æ¼­ ó¸®Çϱâ´Â ÁÁÀº ¹æ¹ýÀÌÁö¸¸, Á¦´ë·Î Ȱ¿ëÇϱâ À§Çؼ­´Â ºñºÀ¼â ¼ÒÄÏÀ¸·Î ¸¸µé¾î¾ß ÇÑ´Ù. ´ÙÀ½Àº ¸Å°³ º¯¼ö·Î ³Ñ¾î¿Â ÆÄÀÏÀ» ºñºÀ¼â·Î ¸¸µå´Â ÇÔ¼ö´Ù. acceptÇÔ¼ö°¡ °¡Á®¿À´Â ¿¬°á ¼ÒÄÏÀ» ¾Æ·¡ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ºñ ºÀ¼â·Î ¸¸µé¸é µÈ´Ù.
void nonblock(int sockfd)  
{  
    int opts;  
    opts = fcntl(sockfd, F_GETFL);  
    if(opts < 0)  
    {  
        perror("fcntl(F_GETFL)\n");  
        exit(1);  
    }  
    opts = (opts | O_NONBLOCK);  
    if(fcntl(sockfd, F_SETFL, opts) < 0)  
    {  
        perror("fcntl(F_SETFL)\n");  
        exit(1);  
    }  
 

ºñºÀ¼â ¼ÒÄÏÀº ÀÐÀ» µ¥ÀÌÅͰ¡ ¾øÀ¸¸é Áï½Ã ¹ÝȯÇϴµ¥ ÀÌ ¶§ °ªÀÌ -1ÀÌ´Ù. ±×·Î¹Ç·Î ¿¡·¯ÀÇ Á¾·ù¸¦ È®ÀÎÇϱâ À§Çؼ­ errno°ªÀ» °Ë»çÇØ¾ß ÇÑ´Ù. ´õ ÀÌ»ó ÀÐÀ» µ¥ÀÌÅͰ¡ ¾ø¾î¼­ -1À» ¹ÝȯÇÒ °æ¿ì errno°¡ EAGAIN·Î ¼³Á¤µÈ´Ù. ±×·¯¹Ç·Î ´ÙÀ½°ú °°ÀÌ Äڵ带 º¯°æÇÏ¸é µÈ´Ù.
while( (readn = read(sockfd, buf, MAXLINE-1)) > 0) 
{ 
   write(...); 
} 
if(readn == -1) 
{ 
    if (errno != EAGAIN) 
    { 
        close(sockfd); 
        FD_CLR(sockfd, &readfds); 
    } 
} 
 

category_network
programing
category__5

EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù.