/// <summary> /// _Datagram_CheckNewConnections /// </summary> public qsocket_t InternalCheckNewConnections() { Socket acceptsock = Net.LanDriver.CheckNewConnections(); if (acceptsock == null) { return(null); } EndPoint clientaddr = new IPEndPoint(IPAddress.Any, 0); Net.Message.FillFrom(acceptsock, ref clientaddr); if (Net.Message.Length < sizeof(int)) { return(null); } Net.Reader.Reset(); int control = Common.BigLong(Net.Reader.ReadLong()); if (control == -1) { return(null); } if ((control & (~NetFlags.NETFLAG_LENGTH_MASK)) != NetFlags.NETFLAG_CTL) { return(null); } if ((control & NetFlags.NETFLAG_LENGTH_MASK) != Net.Message.Length) { return(null); } int command = Net.Reader.ReadByte(); if (command == CCReq.CCREQ_SERVER_INFO) { string tmp = Net.Reader.ReadString(); if (tmp != "QUAKE") { return(null); } Net.Message.Clear(); // save space for the header, filled in later Net.Message.WriteLong(0); Net.Message.WriteByte(CCRep.CCREP_SERVER_INFO); EndPoint newaddr = acceptsock.LocalEndPoint; //dfunc.GetSocketAddr(acceptsock, &newaddr); Net.Message.WriteString(newaddr.ToString()); // dfunc.AddrToString(&newaddr)); Net.Message.WriteString(Net.HostName); Net.Message.WriteString(Server.sv.name); Net.Message.WriteByte(Net.ActiveConnections); Net.Message.WriteByte(Server.svs.maxclients); Net.Message.WriteByte(Net.NET_PROTOCOL_VERSION); Common.WriteInt(Net.Message.Data, 0, Common.BigLong(NetFlags.NETFLAG_CTL | (Net.Message.Length & NetFlags.NETFLAG_LENGTH_MASK))); Net.LanDriver.Write(acceptsock, Net.Message.Data, Net.Message.Length, clientaddr); Net.Message.Clear(); return(null); } if (command == CCReq.CCREQ_PLAYER_INFO) { int playerNumber = Net.Reader.ReadByte(); int clientNumber, activeNumber = -1; client_t client = null; for (clientNumber = 0; clientNumber < Server.svs.maxclients; clientNumber++) { client = Server.svs.clients[clientNumber]; if (client.active) { activeNumber++; if (activeNumber == playerNumber) { break; } } } if (clientNumber == Server.svs.maxclients) { return(null); } Net.Message.Clear(); // save space for the header, filled in later Net.Message.WriteLong(0); Net.Message.WriteByte(CCRep.CCREP_PLAYER_INFO); Net.Message.WriteByte(playerNumber); Net.Message.WriteString(client.name); Net.Message.WriteLong(client.colors); Net.Message.WriteLong((int)client.edict.v.frags); Net.Message.WriteLong((int)(Net.Time - client.netconnection.connecttime)); Net.Message.WriteString(client.netconnection.address); Common.WriteInt(Net.Message.Data, 0, Common.BigLong(NetFlags.NETFLAG_CTL | (Net.Message.Length & NetFlags.NETFLAG_LENGTH_MASK))); Net.LanDriver.Write(acceptsock, Net.Message.Data, Net.Message.Length, clientaddr); Net.Message.Clear(); return(null); } if (command == CCReq.CCREQ_RULE_INFO) { // find the search start location string prevCvarName = Net.Reader.ReadString(); Cvar var; if (!String.IsNullOrEmpty(prevCvarName)) { var = Cvar.Find(prevCvarName); if (var == null) { return(null); } var = var.Next; } else { var = Cvar.First; } // search for the next server cvar while (var != null) { if (var.IsServer) { break; } var = var.Next; } // send the response Net.Message.Clear(); // save space for the header, filled in later Net.Message.WriteLong(0); Net.Message.WriteByte(CCRep.CCREP_RULE_INFO); if (var != null) { Net.Message.WriteString(var.Name); Net.Message.WriteString(var.String); } Common.WriteInt(Net.Message.Data, 0, Common.BigLong(NetFlags.NETFLAG_CTL | (Net.Message.Length & NetFlags.NETFLAG_LENGTH_MASK))); Net.LanDriver.Write(acceptsock, Net.Message.Data, Net.Message.Length, clientaddr); Net.Message.Clear(); return(null); } if (command != CCReq.CCREQ_CONNECT) { return(null); } if (Net.Reader.ReadString() != "QUAKE") { return(null); } if (Net.Reader.ReadByte() != Net.NET_PROTOCOL_VERSION) { Net.Message.Clear(); // save space for the header, filled in later Net.Message.WriteLong(0); Net.Message.WriteByte(CCRep.CCREP_REJECT); Net.Message.WriteString("Incompatible version.\n"); Common.WriteInt(Net.Message.Data, 0, Common.BigLong(NetFlags.NETFLAG_CTL | (Net.Message.Length & NetFlags.NETFLAG_LENGTH_MASK))); Net.LanDriver.Write(acceptsock, Net.Message.Data, Net.Message.Length, clientaddr); Net.Message.Clear(); return(null); } #if BAN_TEST // check for a ban if (clientaddr.sa_family == AF_INET) { unsigned long testAddr; testAddr = ((struct sockaddr_in *)&clientaddr)->sin_addr.s_addr;