diff options
-rw-r--r-- | src/net_query.c | 50 | ||||
-rw-r--r-- | src/net_sdl.c | 5 |
2 files changed, 47 insertions, 8 deletions
diff --git a/src/net_query.c b/src/net_query.c index d4955061..07d947b5 100644 --- a/src/net_query.c +++ b/src/net_query.c @@ -37,10 +37,40 @@ #include "net_query.h" #include "net_sdl.h" -static net_addr_t *first_response_addr; static net_context_t *query_context; +static net_addr_t **responders; static int num_responses; +// Add a new address to the list of hosts that has responded + +static void NET_Query_AddResponder(net_addr_t *addr) +{ + responders = realloc(responders, + sizeof(net_addr_t *) * (num_responses + 1)); + responders[num_responses] = addr; + ++num_responses; +} + +// Returns true if the reply is from a host that has not previously +// responded. + +static boolean NET_Query_CheckResponder(net_addr_t *addr) +{ + int i; + + for (i=0; i<num_responses; ++i) + { + if (responders[i] == addr) + { + return false; + } + } + + return true; +} + +// Transmit a query packet + static void NET_Query_SendQuery(net_addr_t *addr) { net_packet_t *request; @@ -108,6 +138,13 @@ static void NET_Query_ParsePacket(net_addr_t *addr, net_packet_t *packet) char *server_description; int i; + // Have we already received a packet from this host? + + if (!NET_Query_CheckResponder(addr)) + { + return; + } + if (!NET_ReadInt16(packet, &packet_type) || !(server_version = NET_ReadString(packet)) || !NET_ReadInt8(packet, &in_game) @@ -131,8 +168,6 @@ static void NET_Query_ParsePacket(net_addr_t *addr, net_packet_t *packet) for (i=0; i<70; ++i) putchar('='); putchar('\n'); - - first_response_addr = addr; } formatted_printf(18, "%s: ", NET_AddrToString(addr)); @@ -150,7 +185,7 @@ static void NET_Query_ParsePacket(net_addr_t *addr, net_packet_t *packet) NET_SafePuts(server_description); - ++num_responses; + NET_Query_AddResponder(addr); } static void NET_Query_GetResponse(void) @@ -198,7 +233,10 @@ static net_addr_t *NET_Query_QueryLoop(net_addr_t *addr, I_Sleep(100); } - return first_response_addr; + if (num_responses > 0) + return responders[0]; + else + return NULL; } void NET_Query_Init(void) @@ -207,7 +245,7 @@ void NET_Query_Init(void) NET_AddModule(query_context, &net_sdl_module); net_sdl_module.InitClient(); - first_response_addr = NULL; + responders = NULL; num_responses = 0; } diff --git a/src/net_sdl.c b/src/net_sdl.c index 4ccc6067..820c9ca9 100644 --- a/src/net_sdl.c +++ b/src/net_sdl.c @@ -1,7 +1,7 @@ // Emacs style mode select -*- C++ -*- //----------------------------------------------------------------------------- // -// $Id: net_sdl.c 543 2006-05-29 20:04:08Z fraggle $ +// $Id: net_sdl.c 611 2006-09-17 18:01:16Z fraggle $ // // Copyright(C) 2005 Simon Howard // @@ -221,7 +221,8 @@ static void NET_SDL_SendPacket(net_addr_t *addr, net_packet_t *packet) if (addr == &net_broadcast_addr) { - SDLNet_ResolveHost(&ip, NULL, DEFAULT_PORT); + SDLNet_ResolveHost(&ip, NULL, port); + ip.host = INADDR_BROADCAST; } else { |