| 594 | ENetSocketSet readset, writeset; |
| 595 | |
| 596 | void checkclients() |
| 597 | { |
| 598 | ENetSocketSet readset, writeset; |
| 599 | ENetSocket maxsock = max(serversocket, pingsocket); |
| 600 | ENET_SOCKETSET_EMPTY(readset); |
| 601 | ENET_SOCKETSET_EMPTY(writeset); |
| 602 | ENET_SOCKETSET_ADD(readset, serversocket); |
| 603 | ENET_SOCKETSET_ADD(readset, pingsocket); |
| 604 | loopv(mclients) |
| 605 | { |
| 606 | mclient &c = *mclients[i]; |
| 607 | if(c.message || c.output.length()) ENET_SOCKETSET_ADD(writeset, c.socket); |
| 608 | else ENET_SOCKETSET_ADD(readset, c.socket); |
| 609 | maxsock = max(maxsock, c.socket); |
| 610 | } |
| 611 | if(enet_socketset_select(maxsock, &readset, &writeset, 1000)<=0) return; |
| 612 | |
| 613 | if(ENET_SOCKETSET_CHECK(readset, pingsocket)) checkserverpongs(); |
| 614 | if(ENET_SOCKETSET_CHECK(readset, serversocket)) |
| 615 | { |
| 616 | ENetAddress address; |
| 617 | ENetSocket clientsocket = enet_socket_accept(serversocket, &address); |
| 618 | if(mclients.length()>=CLIENT_LIMIT || checkban(bans, address.host)) enet_socket_destroy(clientsocket); |
| 619 | else if(clientsocket!=ENET_SOCKET_NULL) |
| 620 | { |
| 621 | int dups = 0, oldest = -1; |
| 622 | loopv(mclients) if(mclients[i]->address.host == address.host) |
| 623 | { |
| 624 | dups++; |
| 625 | if(oldest<0 || mclients[i]->connecttime < mclients[oldest]->connecttime) oldest = i; |
| 626 | } |
| 627 | if(dups >= DUP_LIMIT) purgeclient(oldest); |
| 628 | |
| 629 | mclient *c = new mclient; |
| 630 | c->address = address; |
| 631 | c->socket = clientsocket; |
| 632 | c->connecttime = servtime; |
| 633 | c->lastinput = servtime; |
| 634 | mclients.add(c); |
| 635 | } |
| 636 | } |
| 637 | |
| 638 | loopv(mclients) |
| 639 | { |
| 640 | mclient &c = *mclients[i]; |
| 641 | if((c.message || c.output.length()) && ENET_SOCKETSET_CHECK(writeset, c.socket)) |
| 642 | { |
| 643 | const char *data = c.output.length() ? c.output.getbuf() : c.message->getbuf(); |
| 644 | int len = c.output.length() ? c.output.length() : c.message->length(); |
| 645 | ENetBuffer buf; |
| 646 | buf.data = (void *)&data[c.outputpos]; |
| 647 | buf.dataLength = len-c.outputpos; |
| 648 | int res = enet_socket_send(c.socket, NULL, &buf, 1); |
| 649 | if(res>=0) |
| 650 | { |
| 651 | c.outputpos += res; |
| 652 | if(c.outputpos>=len) |
| 653 | { |
no test coverage detected