ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 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);
}
}
|
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|