이 프로그램이 non-blocking으로 작동이 되는지 궁금합니다.
글쓴이: faraplay / 작성시간: 월, 2012/06/25 - 9:34오전
제가 알기로 non-blcoking 를 하는 방법은
int oldopts; oldopts = fcntl(sockfd, F_GETFL, 0); fcntl(sockfd, F_SETFL, oldopts | O_NONBLOCK);
이렇게 하는 것으로 알고 있습니다. 그런데 어떤 소스를 보는데
int i; int opt = 1; long sockArgs; int sock; struct sockaddr_in serv_addr; struct epoll_event ev; memset ((char *) &serv_addr, 0x00, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = (unsigned short)htons (port); /* open tcp socket */ if ((sock = socket (AF_INET, SOCK_STREAM, 0)) < 0) return -1; setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(int)); if (bind(sock, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) return -1; if (listen(sock, 1) < 0) return -1; sockArgs = fcntl(sock, F_GETFL); fcntl(sock, F_SETFL, sockArgs | FNDELAY); ev.events = EPOLLIN; ev.data.fd = sock; epoll_ctl(epollFd, EPOLL_CTL_ADD, sock, &ev);
이런 식으로 작성된 소스가 있더라고요
sockArgs = fcntl(sock, F_GETFL); fcntl(sock, F_SETFL, sockArgs | FNDELAY);
이런 방법으로도 non-blocking으로 작동이 되는건지 궁금합니다.
Forums:
block모드로 동작합니다.block모드로
block모드로 동작합니다.
block모드로 동작하더라도 epoll_wait를 사용한 멀티플렉싱으로 동작하기 때문에,
쓰레드 없이도 잘 동작할 수 있습니다.
epoll_wait나 select같은 함수 통과후에 recv를 할 때도 블럭되는 경우가 있다는 쓰레드를 kldp에서 본적이 있습니다.
만약 그런 경우가 생긴다면 recv timeout을 주어서 빠져나오도록 하면 되겠습니다.
Signature :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기