2012-05-27 30 views
0

我有下面的代码在windows环境下运行得很好,而在linux中使用相同的代码它不(除了几个库的变化)。选择功能不响应新的连接。选择功能窗口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。 –