2012-05-27 5 views
0

У меня есть следующий код, который работает только под окнами env, а в Linux - с использованием того же кода, что и у него (кроме нескольких изменений в lib). Функция select не отвечает на новые подключения.select function windows vs linux

Соответствующий код выглядит следующим образом:

struct SocketState 
{ 
    int id;   // Socket handle 
    int recv;   // Receiving? 
    int send;   // Sending? 
    int sendSubType; // Sending sub-type 
    char buffer[128]; 
    int len; 
    int authenticate; 
    char userName[10]; 
}; 


struct SocketState sockets[MAX_SOCKETS]={0}; 

int socketsCount = 0; 


int main() 
{ 


    int listenSocket = socket(PF_INET, SOCK_STREAM, 0); 

    if (-1 == listenSocket) 
    { 
     return 0 ; 
    } 

    struct sockaddr_in serverService; 

    serverService.sin_family = AF_INET; 

    serverService.sin_addr.s_addr = htonl(INADDR_ANY); 

    serverService.sin_port = htons(TIME_PORT); 


    if (-1 == bind(listenSocket, (struct sockaddr*)&serverService, sizeof(serverService))) 
    { 
    perror("Couldn't bind socket"); 
     return -1; 
    } 


    if (-1 == listen(listenSocket, 10)) 
    { 

     perror("Couldn't listen to port");  
    } 

    addSocket(listenSocket, LISTEN); 


     while (true) 
    { 

     fd_set waitRecv; 
     FD_ZERO(&waitRecv); 
     for (int i = 0; i < MAX_SOCKETS; i++) 
     { 
      if ((sockets[i].recv == LISTEN) || (sockets[i].recv == RECEIVE)) 
       FD_SET(sockets[i].id, &waitRecv); 
     } 

     fd_set waitSend; 
     FD_ZERO(&waitSend); 
     for (int i = 0; i < MAX_SOCKETS; i++) 
     { 
      if (sockets[i].send == SEND) 
       FD_SET(sockets[i].id, &waitSend); 
     } 


     int nfd; 
     nfd = select(0, &waitRecv, &waitSend, NULL, NULL); 
     if (nfd == -1) 
     { 

      return 0 ; 
     } 
     } 
} 

ответ

2

Вы проходящее 0 в качестве первого аргумента select. Это не правильно. Вероятно, в Windows этот параметр не используется, но в linux он должен быть установлен правильно.

Он должен быть установлен на число, тем выше fd плюс 1.

+0

TNX, я читал, что раньше, и это не помогает, когда я позвонил снова, чтобы выбрать() на следующей итерации. Я использовал макрос FD_SETSIZE, который решает проблему. –

Смежные вопросы