Select is giving me trouble when I have more then 500 connections.
My errorhandler is telling me the system seg faults when it tries to use the FD_SET command once I get over 500 or so connections. This mainly happens when my program is accepting connections. Once someone is already connected it does not seem to have a problem in this area, but new connections can cause the segmentation fault. if anyone knows why this is doing this please let me know.
Here is the code for my Socket_Core
ThanksCode:void cSCore::runcore(void) { /*Lets Initialize Some Variables*/ int *lsfd = new int; //Listening File Descriptor int *nsfd = new int; //Sfd For New Connections int returnval; int *maxfd = new int; char *buffer; //Temporary Message Buffer char *charbuffer = new char[1]; struct sockaddr_in *newc = new sockaddr_in; fd_set *cset = new fd_set; fd_set *master = new fd_set; memset(charbuffer,0,1); *lsfd = Socket->cs_serve(Port); int *optval = new int; *optval = 1; setsockopt(*lsfd,SOL_SOCKET,SO_REUSEADDR,optval,sizeof(*optval)); //FD_ZERO(cset); FD_ZERO(master); FD_ZERO(cset); FD_SET(*lsfd, master); //Add the listening sfd to the FD set *maxfd = *lsfd; sMainUsers *tempuser; while(enabled) { *cset = *master; select((*maxfd)+1,cset,NULL,NULL,NULL); if(FD_ISSET(*lsfd, cset)) //If It is a New Connection { *nsfd = accept(*lsfd,NULL,(socklen_t *)sizeof(*newc)); ErrorHandler->ProduceError(0,"cSCore::runcore()","New Connection Received"); if(!UserHandler->AddUser(*nsfd,"unsupported")) { ErrorHandler->ProduceError(0,"cSCore::runcore()","Failed To Add User"); close(*nsfd); } else { info("cSCore::runcore()","Adding to FD Set"); FD_SET(*nsfd,master); if(*nsfd > *maxfd) *maxfd = *nsfd; } } else { ErrorHandler->ProduceError(0,"cSCore::runcore()","Data Received"); tempuser = UserHandler->GetUser(0); //ErrorHandler->ProduceError(0,"cSCore::runcore()","UserPtr Caught"); while(tempuser != NULL) { //ErrorHandler->ProduceError(0,"cSCore::runcore()","looping list"); /*A User wants to send something*/ if(FD_ISSET(tempuser->sfd,cset) && tempuser->sfd != *lsfd) { *nsfd = tempuser->sfd; ErrorHandler->ProduceError(0,"cSCore::runcore()","reading data"); returnval = Socket->cs_read(*nsfd,charbuffer,1); //printf("Buffer value: %d\n",int(charbuffer[0])); //Check For Disconnects if(returnval == 0) { ChannelHandler->UserDisconnected(*nsfd); info("cSCore::runcore()","User Disconnected From Channels"); UserHandler->RemoveUser(*nsfd); info("cSCore::runcore()","User Disconnected"); close(*nsfd); FD_CLR(*nsfd,master); if(UserHandler->numusers == 0) { FD_ZERO(master); FD_SET(*lsfd,master); } break; } else { if(int(charbuffer[0]) == -1) //Byte 255 { this->parsecmd(*nsfd,tempuser->UserBuffer->buffer); (tempuser->UserBuffer->done) = true; } else if((tempuser->UserBuffer->strsize) < ((tempuser->UserBuffer->buffersize) - 1)) { tempuser->UserBuffer->buffer[(tempuser->UserBuffer->strsize)] = charbuffer[0]; (tempuser->UserBuffer->strsize)++; } else if((tempuser->UserBuffer->buffersize) < 512) { (tempuser->UserBuffer->buffersize) += 5; buffer = new char[(tempuser->UserBuffer->buffersize)]; memset(buffer,0,(tempuser->UserBuffer->buffersize)); char *temp = tempuser->UserBuffer->buffer; strcpy(buffer,temp); buffer[(tempuser->UserBuffer->strsize)] = charbuffer[0]; (tempuser->UserBuffer->strsize)++; tempuser->UserBuffer->buffer = buffer; delete [] temp; } else { (tempuser->UserBuffer->done) = true; } if((tempuser->UserBuffer->done) == true) { char *temp = tempuser->UserBuffer->buffer; tempuser->UserBuffer->buffer = new char[10]; memset(tempuser->UserBuffer->buffer,0,10); (tempuser->UserBuffer->strsize) = 0; (tempuser->UserBuffer->buffersize) = 10; (tempuser->UserBuffer->done) = false; delete [] temp; } } break; } tempuser=tempuser->next; } } } close(*lsfd); delete master; delete cset; delete nsfd; delete maxfd; delete lsfd; delete [] buffer; }



LinkBack URL
About LinkBacks


