ÃÑ ÆäÀÌÁö ¼ö : 3224
![]()
|
Facebook Joinc ±×·ì
Joinc QA »çÀÌÆ®
![]()
Tweet
joinc´Â Firefox¿Í chrome¿¡¼ Å×½ºÆ® Çß½À´Ï´Ù. IE¿¡¼´Â Å×À̺íÀÌ ±úÁö°Å³ª À̹ÌÁö°¡ º¸ÀÌÁö ¾ÊÀ» ¼ö ÀÖ½À´Ï´Ù. ƯÈ÷ ±¸±Û DocsÀ̹ÌÁöÀÇ °æ¿ì ¿¢¹Úó¸®µÉ ¼ö ÀÖ½À´Ï´Ù. 2.6 epoll Áö¿ø
ÀÌÀüÀÇ epoll¹®¼°¡ Kernel 2.4 ±â¹ÝÀ¸·Î, 2.6ÀÌ ´ëÁßÈµÈ Çö ½ÃÁ¡¿¡¼´Â ³Ê¹« ¿À·¡µÈ °¨ÀÌ ÀÖ¾î¼ 2.6±â¹ÝÀ¸·Î ÀçÀÛ¼ºÇغ¸±â·Î Çß´Ù. ¿¹Àü ¹®¼´Â ±×´ë·Î ³²°ÜµÎ±â·Î Çß´Ù. epoll¿¡ ´ëÇÑ °³°ýÀûÀÎ ³»¿ëÀº ¿¹Àü¹®¼¸¦ È®ÀÎÇØ º¸±â ¹Ù¶ø´Ï´Ù.
2.4¿¡¼ epollÀº Á¤½ÄÁö¿ø »çÇ×ÀÌ ¾Æ´Ï¾úÁö¸¸, 2.6¿¡¼´Â Á¤½ÄÁö¿øÀÌ µÇ´Â °ü°è·Î º°µµÀÇ Ä¿³ÎÆÐÄ¡¶óµçÁö ¶óÀ̺귯¸®¼³Ä¡°¡ ÇÊ¿ä ¾ø¾îÁ³½À´Ï´Ù.
¾Æ·¡´Â °£´ÜÇÑ ¿¹Á¦ÀÔ´Ï´Ù. ET (EPOLLET) ¹æ½ÄÀ̱⠶§¹®¿¡ ¼ÒÄÏÀ» nonblockingÀ¸·Î Çß½À´Ï´Ù. ET·Î ÇÒ°ÍÀÎÁö LT·Î ÇÒ°ÍÀÎÁö¿¡ ´ëÇØ¼ »ý°¢ÀÌ ´Ù¸¦ ¼ö Àִµ¥, ¼ÓÆíÇÏ°Ô LT·Î ÇÏ´Â°Ô ¾î¶³±îÇÕ´Ï´Ù.
#include <pthread.h> #include <stdio.h> #include <sys/timeb.h> #include <sys/socket.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/epoll.h> #include <netinet/in.h> #include <string.h> #include <fcntl.h> #include <signal.h> #include <errno.h> #include <stdlib.h> #include <unistd.h> #define MAX_CLIENT 101 #define PORT 3355 #define MAX_LINE 1024 #define DEBUG int listenfd; // nonblock ¼ÒÄÏ»ý¼º 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); } } int main(int argc, char **argv) { int epfd; struct epoll_event *events; struct epoll_event ev; struct sockaddr_in srv; int clifd; int i; int n; int res; char buffer[MAX_LINE]; if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("sockfd\n"); exit(1); } events = malloc(sizeof(struct epoll_event) * MAX_CLIENT); bzero(&srv, sizeof(srv)); srv.sin_family = AF_INET; srv.sin_addr.s_addr = INADDR_ANY; srv.sin_port = htons(PORT); if( bind(listenfd, (struct sockaddr *) &srv, sizeof(srv)) < 0) { perror("bind\n"); exit(1); } listen(listenfd, 5); epfd = epoll_create(MAX_CLIENT); if(!epfd) { perror("epoll_create\n"); exit(1); } ev.events = EPOLLIN | EPOLLHUP | EPOLLET; ev.data.fd = listenfd; if(epoll_ctl(epfd, EPOLL_CTL_ADD, listenfd, &ev) < 0) { perror("epoll_ctl, adding listenfd\n"); exit(1); } for( ; ; ) { res = epoll_wait(epfd, events, MAX_CLIENT, 0); for(i = 0; i < res; i++) { if(events[i].data.fd == listenfd) { clifd = accept(listenfd, NULL, NULL); if(clifd > 0) { nonblock(clifd); ev.events = EPOLLIN | EPOLLET; ev.data.fd = clifd; if(epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev) < 0) { perror("epoll_ctl ADD\n"); exit(1); } } } else { memset(buffer, 0x00, MAX_LINE); n = recv(events[i].data.fd, buffer, MAX_LINE-1, 0); if(n == 0) { #ifdef DEBUG printf("%d closed connection\n", events[i].data.fd); epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, NULL); #endif } else if(n < 0) { #ifdef DEBUG printf("%d error occured, errno: %d\n", events[i].data.fd, errno); #endif } else { #ifdef DEBUG printf("%d data received: %s", events[i].data.fd, buffer); bzero(&buffer, strlen(buffer)); #endif send(events[i].data.fd, buffer, strlen(buffer), 0); } } } } return 0; }
Java1.5¿¡ NIO°¡ Æ÷ÇԵǾî ÀÖ´øµ¥, ¸®´ª½º¿¡¼ÀÇ NIO ´Â °á±¹ epollÀÇ ±¸ÇöÀÌ¿´´Ù.
|
|
|
EmailÀ» ±âÀÔÇϸé, ´ñ±ÛÀÌ ¸ÞÀÏ·Î Àü´ÞµË´Ï´Ù. |
|