Greetings,

Can some point me in the correction direction please.

I have a treaded socket application that has a problem with select() returning 
-1.
The select() and accept() is taken care of in one thread. The worker threads 
deal with client requests after the new client connection is pushed to queue.

The logged error is :
select() failed (Bad file descriptor) getdtablesize = 65536

Sysctls at the moment  are:
kern.maxfiles: 65536 
kern.maxfilesperproc: 65536


<code>
void client_accept(int listen_socket)
{
...
   while ( loop )
   {
      FD_ZERO(&socket_set);
      FD_SET(listen_socket, &socket_set);
      timeout.tv_sec = 1;
      timeout.tv_usec = 0;

      rcode = select(listen_socket + 1, &socket_set, NULL, NULL, &timeout);

      if ( rcode < 0 )
      {
         Log(DEBUG_0, "ERROR: select() failed (%s) getdtablesize = %d",
             strerror(errno), getdtablesize());
         loop = 0;
         sleep(30);
         fcloseall();
         assert(1==0);
      }

      if ( rcode > 0 )
      {
          remotelen = sizeof(remote);
          client_sock = accept(listen_socket, .....
          
          if (msgsock != -1 )
          { 
             // Allocate memory for request
             request = malloc(sizeof(struct requests));
             // test for malloc etc ...
             // set request values ...
             //
             // Push request to a queue. 
          }
      }

   }
 ...
}
void* tcpworker(void* arg)
{
   // initialise stuff

   While ( loop )
   {
      // pop request from queue
      
      If ( request != NULL )
      {
         // deal with request
         free(request)
      }
   }   
}

</code>
When the problem occurs, i have between 1000 and 1400 clients connected.

Questions:
1. do i need to FD_CLR(client_sock,&socket_set) before i push to a queue ?
2. do i need to FD_CLR(client_sock, &socket_set) when this client request 
closes in the the tcpworker() function ?
3. would setting kern.maxfilesperproc and kern.maxfiles to higher values solve 
the problem or just take longer for the problem to re-appear.
4. should is replace select() with kqueue() as from google-ing it seems 
select() is not that great.


Thanks
Vikash

Please note: This email and its content are subject to the disclaimer as 
displayed at the following link 
http://www.is.co.za/legal/E-mail+Confidentiality+Notice+and+Disclaimer.htm. 
Should you not have Web access, send a mail to disclaim...@is.co.za and a copy 
will be emailed to you.
_______________________________________________
freebsd-questions@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-questions
To unsubscribe, send any mail to "freebsd-questions-unsubscr...@freebsd.org"

Reply via email to