2013-06-30 2 views
0

После многих попыток я не смог получить свою работу select(). Я так потерян! В результате я получаю -1. Я следую this guide.У меня проблемы с select()

listen(sock, MAXQUEUE); 
build_select_list(sock, connectlist, highsock, socks); 

readsocks = select(FD_SETSIZE, &socks, (fd_set *) 0, (fd_set *) 0, 
     NULL); 

Эти функции я использую:

void build_select_list(int sock, int connectlist[], int highsock, fd_set socks) { 
int listnum; 

FD_ZERO(&socks); 

FD_SET(sock, &socks); 

/* Loops through all the possible connections and adds 
those sockets to the fd_set */ 

for (listnum = 0; listnum < MAXQUEUE; listnum++) { 
    if (connectlist[listnum] != 0) { 
     FD_SET(connectlist[listnum], &socks); 
     if (connectlist[listnum] > highsock) 
      highsock = connectlist[listnum]; 
    } 
}} 

И это, как я получаю дескриптор файла моего слушателя:

int socketServer(char* portNumber) { 

    int sockfd; // listen on sock_fd, new connection on new_fd 
    struct addrinfo hints, *servinfo, *p; 
    struct sigaction sa; 
    int yes = 1; 
    int rv; 
    memset(&hints, 0, sizeof hints); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_STREAM; 
    hints.ai_flags = AI_PASSIVE; // use my IP 
    if ((rv = getaddrinfo(NULL, portNumber, &hints, &servinfo)) != 0) { 
     fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
     return 1; 
    } 
    // loop through all the results and bind to the first we can 
    for (p = servinfo; p != NULL ; p = p->ai_next) { 
     if ((sockfd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) 
       == -1) { 
      perror("server: socket"); 
      continue; 
     } 
     if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) 
       == -1) { 
      perror("setsockopt"); 
      exit(1); 
     } 
     if (bind(sockfd, p->ai_addr, p->ai_addrlen) == -1) { 
      close(sockfd); 
      perror("server: bind"); 
      continue; 
     } 
     break; 
    } 
    if (p == NULL) { 
     fprintf(stderr, "server: failed to bind\n"); 
     return 2; 
    } 
    freeaddrinfo(servinfo); // all done with this structure 
    if (listen(sockfd, BACKLOG) == -1) { 
     perror("listen"); 
     exit(1); 
    } 
    sa.sa_handler = sigchld_handler; // reap all dead processes 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = SA_RESTART; 
    if (sigaction(SIGCHLD, &sa, NULL) == -1) { 
     perror("sigaction"); 
     exit(1); 
    } 
    return sockfd; 

}

+1

Используйте 'perror', чтобы распечатать описание ошибки. –

ответ

2

Ваш build_select_list функция принимает a копия набора и модификация ies только эта локальная копия. Передайте его «по ссылке», так же, как вы делаете с функцией select.

И, конечно, вы должны вызывать эту функцию каждый раз, когда вы звоните по телефону select, так как функция select изменяет набор.

+0

Большое спасибо! знак равно –