이 프로그램이 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 :) - "여유를 갖고 행동하되 게을러지지 말자"
댓글 달기