whee, clients now get spammed with text messages when "connected" to a

server
This commit is contained in:
Bill Currie 2005-05-07 13:57:07 +00:00
parent 84dd9c1a13
commit 88ae6de8bf
5 changed files with 121 additions and 16 deletions

View file

@ -36,11 +36,17 @@
#include "qw/msg_backbuf.h"
typedef struct client_s {
struct client_s *next;
struct client_s **prev;
struct info_s *userinfo;
struct connection_s *con;
int drop;
netchan_t netchan;
backbuf_t backbuf;
sizebuf_t datagram;
byte datagram_buf[MAX_DATAGRAM];
struct server_s *server;
} client_t;
typedef struct challenge_s {

View file

@ -35,6 +35,8 @@
#include "netchan.h"
#include "qw/pmove.h"
struct client_s;
typedef struct player_s {
struct player_s *next; // for multicast messages
struct info_s *info;
@ -77,6 +79,8 @@ typedef struct server_s {
int sounds;
struct info_s *info;
struct client_s *clients;
int delta;
frame_t frames[UPDATE_BACKUP];
@ -91,6 +95,9 @@ typedef struct server_s {
void Server_Init (void);
void Server_Frame (void);
void Server_List (void);
void Server_Connect (const char *name, struct client_s *client);
void Server_Disconnect (struct client_s *client);
struct qmsg_s;
void sv_parse (server_t *sv, struct msg_s *msg, int reliable);

View file

@ -58,6 +58,7 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "client.h"
#include "connection.h"
#include "qtv.h"
#include "server.h"
typedef struct ucmd_s {
const char *name;
@ -158,6 +159,28 @@ cl_ptrack_f (client_t *cl, void *unused)
static void
cl_list_f (client_t *cl, void *unused)
{
Server_List ();
}
static void
cl_connect_f (client_t *cl, void *unused)
{
if (cl->server) {
qtv_printf ("already connected to server %s\n", cl->server->name);
qtv_printf ("\"cmd disconnect\" first\n");
return;
}
Server_Connect (Cmd_Argv (1), cl);
}
static void
cl_disconnect_f (client_t *cl, void *unused)
{
if (!cl->server) {
qtv_printf ("not connected to a server\n");
return;
}
Server_Disconnect (cl);
}
static ucmd_t ucmds[] = {
@ -168,7 +191,7 @@ static ucmd_t ucmds[] = {
{"spawn", cl_spawn_f, 0, 0},
{"begin", cl_begin_f, 1, 0},
{"drop", cl_drop_f, 0, 0},
{"drop", cl_drop_f, 1, 0},
{"pings", cl_pings_f, 0, 0},
// issued by hand at client consoles
@ -192,6 +215,8 @@ static ucmd_t ucmds[] = {
{"snap", 0, 0, 0},
{"list", cl_list_f, 0, 0},
{"connect", cl_connect_f, 0, 0},
{"disconnect", cl_disconnect_f, 0, 0},
};
static hashtab_t *ucmd_table;
@ -331,15 +356,6 @@ client_handler (connection_t *con, void *object)
qtv_printf ("%s: Runt packet\n", NET_AdrToString (net_from));
return;
}
#if 0
// read the qport out of the message so we can fix up
// stupid address translating routers
MSG_ReadLong (net_message); // sequence number
MSG_ReadLong (net_message); // sequence number
qport = MSG_ReadShort (net_message) & 0xffff;
if (cl->netchan.qport != qport)
return;
#endif
if (Netchan_Process (&cl->netchan)) {
// this is a valid, sequenced packet, so process it
//svs.stats.packets++;
@ -348,7 +364,9 @@ client_handler (connection_t *con, void *object)
client_parse_message (cl);
if (cl->backbuf.num_backbuf)
MSG_Reliable_Send (&cl->backbuf);
Netchan_Transmit (&cl->netchan, 0, NULL);
Netchan_Transmit (&cl->netchan, cl->datagram.cursize,
cl->datagram.data);
SZ_Clear (&cl->datagram);
if (cl->drop) {
Connection_Del (cl->con);
Info_Destroy (cl->userinfo);
@ -411,6 +429,10 @@ client_connect (connection_t *con, void *object)
con->object = cl;
con->handler = client_handler;
cl->datagram.allowoverflow = true;
cl->datagram.maxsize = sizeof (cl->datagram_buf);
cl->datagram.data = cl->datagram_buf;
qtv_printf ("client %s (%s) connected\n",
Info_ValueForKey (userinfo, "name"),
NET_AdrToString (con->address));

View file

@ -57,6 +57,7 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "qw/protocol.h"
#include "client.h"
#include "connection.h"
#include "qtv.h"
#include "server.h"
@ -429,10 +430,12 @@ sv_list_f (void)
return;
}
list = malloc (count * sizeof (server_t **));
for (l = &servers, count = 0; *l; l = &(*l)->next)
for (l = &servers, count = 0; *l; l = &(*l)->next, count++)
list[count] = *l;
qsort (list, count, sizeof (*list), server_compare);
for (l = list; *l; l++) {
qtv_printf ("Name Address\n");
qtv_printf ("-------------------- --------------------\n");
for (l = list; count--; l++) {
sv = *l;
qtv_printf ("%-20s %s(%s)\n", sv->name, sv->address,
NET_AdrToString (sv->adr));
@ -490,3 +493,36 @@ Server_Frame (void)
}
}
}
void
Server_List (void)
{
sv_list_f ();
}
void
Server_Connect (const char *name, struct client_s *client)
{
server_t *sv;
if (!(sv = Hash_Find (server_hash, name))) {
qtv_printf ("server not found: %s\n", name);
return;
}
client->server = sv;
client->prev = &sv->clients;
client->next = sv->clients;
if (sv->clients)
sv->clients->prev = &client->next;
sv->clients = client;
}
void
Server_Disconnect (struct client_s *client)
{
client->server = 0;
if (client->next)
client->next->prev = client->prev;
*client->prev = client->next;
}

View file

@ -58,10 +58,32 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "qw/msg_ucmd.h"
#include "qw/protocol.h"
#include "client.h"
#include "connection.h"
#include "qtv.h"
#include "server.h"
static void
sv_broadcast (server_t *sv, int reliable, byte *msg, int len)
{
client_t *cl;
byte svc;
if (len < 1)
return;
svc = *msg++;
len--;
for (cl = sv->clients; cl; cl = cl->next) {
if (reliable) {
MSG_ReliableWrite_Begin (&cl->backbuf, svc, len + 1);
MSG_ReliableWrite_SZ (&cl->backbuf, msg, len);
} else {
MSG_WriteByte (&cl->datagram, svc);
SZ_Write (&cl->datagram, msg, len);
}
}
}
static void
sv_serverdata (server_t *sv, qmsg_t *msg)
{
@ -754,6 +776,20 @@ sv_nails (server_t *sv, qmsg_t *msg, int nails2)
}
}
static void
sv_print (server_t *sv, qmsg_t *msg)
{
byte *data;
int len;
len = msg->readcount - 1;
data = msg->message->data + len;
MSG_ReadByte (msg);
qtv_printf ("%s", MSG_ReadString (msg));
len = msg->readcount - len;
sv_broadcast (sv, 1, data, len);
}
void
sv_parse (server_t *sv, qmsg_t *msg, int reliable)
{
@ -779,9 +815,7 @@ sv_parse (server_t *sv, qmsg_t *msg, int reliable)
sv_sound (sv, msg, 0);
break;
case svc_print:
//XXX
MSG_ReadByte (msg);
qtv_printf ("%s", MSG_ReadString (msg));
sv_print (sv, msg);
break;
case svc_setangle:
sv_setangle (sv, msg);