void Client::mainLoop(fd_set *rset) { if(!FD_ISSET(sd,rset)) return; memset(&buff,0,sizeof(buff)); len = recv(sd,buff,sizeof(buff),0); if(len<1) goto end; lastPacket = time(NULL); if(!do_db_check()) return gamespy3dxor(buff, len); buff[len]=0; makeStringSafe((char *)&buff, sizeof(buff)); parseIncoming(); return; end: deleteClient(this); }
void *openspy_mod_run(modLoadOptions *options) { int sda,sd; socklen_t psz; struct sockaddr_in peer; memset(&peer,0,sizeof(peer)); int on=1; memcpy(&servoptions,options,sizeof(modLoadOptions)); conn = mysql_init(NULL); mysql_options(conn,MYSQL_OPT_RECONNECT, (char *)&on); /* Connect to database */ if (!mysql_real_connect(conn, servoptions.mysql_server, servoptions.mysql_user, servoptions.mysql_password, servoptions.mysql_database, 0, NULL, CLIENT_MULTI_RESULTS)) { fprintf(stderr, "%s\n", mysql_error(conn)); return NULL; } peer.sin_port = htons(SEARCHPORT); peer.sin_family = AF_INET; peer.sin_addr.s_addr = servoptions.bindIP; sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) return NULL; if(bind(sd, (struct sockaddr *)&peer, sizeof(struct sockaddr_in)) < 0) return NULL; if(listen(sd, SOMAXCONN) < 0) return NULL; for(;;) { psz = sizeof(struct sockaddr_in); sda = accept(sd, (struct sockaddr *)&peer, &psz); if(sda <= 0) continue; if(!do_db_check()) { sendError(sda,"Database Error: try again later"); close(sda); continue; //TODO: send database error message } handleConnection(sda); } }
void *openspy_mod_run(modLoadOptions *options) { int sda,sd; socklen_t psz; fd_set rset; struct sockaddr_in peer; struct sockaddr_in user; memset(&peer,0,sizeof(peer)); int on=1; memcpy(&servoptions,options,sizeof(modLoadOptions)); conn = mysql_init(NULL); mysql_options(conn,MYSQL_OPT_RECONNECT, (char *)&on); /* Connect to database */ if (!mysql_real_connect(conn, servoptions.mysql_server, servoptions.mysql_user, servoptions.mysql_password, servoptions.mysql_database, 0, NULL, CLIENT_MULTI_RESULTS)) { fprintf(stderr, "%s\n", mysql_error(conn)); return NULL; } peer.sin_port = htons(LEGACYMSPORT); peer.sin_family = AF_INET; peer.sin_addr.s_addr = servoptions.bindIP; sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) < 0) return NULL; if(bind(sd, (struct sockaddr *)&peer, sizeof(struct sockaddr_in)) < 0) return NULL; if(listen(sd, SOMAXCONN) < 0) return NULL; struct timeval timeout; memset(&timeout,0,sizeof(struct timeval)); for(;;) { int hsock; FD_ZERO(&rset); FD_SET(sd, &rset); hsock = getnfds(&rset); if(hsock < sd) hsock = sd; timeout.tv_sec = SB_TIMEOUT_TIME; if(select(hsock+1, &rset, NULL, NULL, &timeout) < 0) continue; if(FD_ISSET(sd, &rset)) { } else { processClients(&rset); continue; } psz = sizeof(struct sockaddr_in); sda = accept(sd, (struct sockaddr *)&user, &psz); if(sda <= 0) continue; if(!do_db_check()) { close(sda); continue; //TODO: send database error message } boost::shared_ptr<Client> c = boost::make_shared<Client>(sda,(struct sockaddr_in *)&user); boost::container::stable_vector< boost::shared_ptr<Client> >::iterator iterator=server.client_list.begin(); boost::container::stable_vector< boost::shared_ptr<Client> >::iterator end=server.client_list.end(); for(;;) { if(iterator == end) { server.client_list.push_back(c); break; } else if(!*iterator) { *iterator = c; break; } else ++iterator; } } }