MCPcopy Create free account
hub / github.com/assaultcube/AC / checkclients

Function checkclients

source/src/master.cpp:596–687  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

594ENetSocketSet readset, writeset;
595
596void 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 {

Callers 1

mainFunction · 0.85

Calls 10

maxFunction · 0.85
checkserverpongsFunction · 0.85
checkbanFunction · 0.85
purgeclientFunction · 0.85
loopvFunction · 0.70
enet_socketset_selectFunction · 0.50
enet_socket_acceptFunction · 0.50
enet_socket_destroyFunction · 0.50
lengthMethod · 0.45
addMethod · 0.45

Tested by

no test coverage detected