From 88ae6de8bf66e5168529eb6a580a36d94f8aa509 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Sat, 7 May 2005 13:57:07 +0000 Subject: [PATCH] whee, clients now get spammed with text messages when "connected" to a server --- qtv/include/client.h | 6 ++++++ qtv/include/server.h | 7 +++++++ qtv/source/client.c | 44 ++++++++++++++++++++++++++++++++----------- qtv/source/server.c | 40 +++++++++++++++++++++++++++++++++++++-- qtv/source/sv_parse.c | 40 ++++++++++++++++++++++++++++++++++++--- 5 files changed, 121 insertions(+), 16 deletions(-) diff --git a/qtv/include/client.h b/qtv/include/client.h index 81f6efd6a..8f8e5aedd 100644 --- a/qtv/include/client.h +++ b/qtv/include/client.h @@ -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 { diff --git a/qtv/include/server.h b/qtv/include/server.h index d05aa6574..bbe3bdb04 100644 --- a/qtv/include/server.h +++ b/qtv/include/server.h @@ -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); diff --git a/qtv/source/client.c b/qtv/source/client.c index b30207ad1..26e8c9f17 100644 --- a/qtv/source/client.c +++ b/qtv/source/client.c @@ -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)); diff --git a/qtv/source/server.c b/qtv/source/server.c index 2c22b2d19..b144244ae 100644 --- a/qtv/source/server.c +++ b/qtv/source/server.c @@ -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; +} diff --git a/qtv/source/sv_parse.c b/qtv/source/sv_parse.c index 6c98910d7..75c92e300 100644 --- a/qtv/source/sv_parse.c +++ b/qtv/source/sv_parse.c @@ -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);