- continue;
- }
- prev = client;
- if(client->flags & QSERVER_FLAG_DISCONNECT) continue;
- if(now - client->lastmsg > QSERVER_TIMEOUT) {
- qserver_put(client, "E :Timeout");
- client->flags |= QSERVER_FLAG_DISCONNECT;
- continue;
- }
- FD_SET(client->sock, &fds);
- if(client->sock > ret)
- ret = client->sock;
- }
- ret = select(ret + 1, &fds, NULL, NULL, &tv);
- if(ret == 0) {
- return;
- }
- if(FD_ISSET(server_sockfd, &fds)) {
- //new connection
- struct sockaddr_in cli_addr;
- socklen_t clilen;
- if(qserver_clientcount >= QSERVER_MAXCLIENTS) {
- qserver_put(client, "E :Maximum QServer Connections reached");
- close(client->sock);
- } else {
- client = malloc(sizeof(*client));
- clilen = sizeof(cli_addr);
- client->sock = accept(server_sockfd, (struct sockaddr *) &cli_addr, &clilen);
- client->flags = 0;
- client->lastmsg = now;
- client->bufferpos = 0;
- client->references = 0;
- client->next = qserver_clients;
- qserver_clients = client;
- qserver_clientcount++;
- }
- }
- int bytes, i;
- char buffer[MAXLEN];
- for (client = qserver_clients; client; client = next) {
- next = client->next;
- if(FD_ISSET(client->sock, &fds)) {
- #ifdef WIN32
- bytes = recv(client->sock, buffer, sizeof(buffer), 0);
- #else
- bytes = read(client->sock, buffer, sizeof(buffer));
- #endif
- if(bytes <= 0) {
- client->flags |= QSERVER_FLAG_DISCONNECT;
- continue;
- }
- for(i = 0; i < bytes; i++) {
- if(client->bufferpos == MAXLEN-1) {
- //buffer overflow
- qserver_put(client, "E :Buffer Overflow");
- client->flags |= QSERVER_FLAG_DISCONNECT;
- break;
- }
- if(buffer[i] == '\r') continue;
- else if(buffer[i] == '\n') {
- client->buffer[client->bufferpos] = '\0';
- qserver_parse(client, client->buffer, client->bufferpos);
- client->bufferpos = 0;
- } else {
- client->buffer[client->bufferpos++] = buffer[i];
- }
- }