shithub: choc

Download patch

ref: f459280f965b6e737466e2e250226aa809627c13
parent: 37f611e199bd7a300def37c84f7fdb205534ca19
author: Simon Howard <fraggle@gmail.com>
date: Thu Dec 29 16:29:55 EST 2005

Working client connect code

Subversion-branch: /trunk/chocolate-doom
Subversion-revision: 233

--- a/src/net_client.c
+++ b/src/net_client.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_client.c 232 2005-12-29 17:48:25Z fraggle $
+// $Id: net_client.c 233 2005-12-29 21:29:55Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2005/12/29 21:29:55  fraggle
+// Working client connect code
+//
 // Revision 1.1  2005/12/29 17:48:25  fraggle
 // Add initial client/server connect code.  Reorganise sources list in
 // Makefile.am.
@@ -38,15 +41,130 @@
 #include "net_packet.h"
 #include "net_server.h"
 
+typedef enum
+{
+    // sent a syn, not received an ack yet
+
+    CLIENT_STATE_CONNECTING,
+
+    // waiting for the game to start
+
+    CLIENT_STATE_WAITING_START,
+
+    // in game
+
+    CLIENT_STATE_IN_GAME,
+} net_clientstate_t;
+
+static net_clientstate_t client_state;
 static net_addr_t *server_addr;
 static net_context_t *client_context;
+static int last_send_time;
 
+// parse a received packet
+
+static void ClientParsePacket(net_packet_t *packet)
+{
+    unsigned int packet_type;
+
+    if (!NET_ReadInt16(packet, &packet_type))
+    {
+        return;
+    }
+
+    switch (packet_type)
+    {
+        case NET_PACKET_TYPE_ACK:
+
+            // received an acknowledgement to the SYN we sent
+
+            if (client_state == CLIENT_STATE_CONNECTING)
+            {
+                client_state = CLIENT_STATE_WAITING_START;
+            }
+            break;
+
+        case NET_PACKET_TYPE_GAMESTART:
+            break;
+
+        case NET_PACKET_TYPE_GAMEDATA:
+            break;
+        default:
+            break;
+    }
+}
+
+// called when we are in the "connecting" state
+
+static void ClientConnecting(void)
+{
+    net_packet_t *packet;
+
+    // send a SYN packet every second
+
+    if (last_send_time < 0 || I_GetTimeMS() - last_send_time > 1000)
+    {
+        // construct a SYN packet
+
+        packet = NET_NewPacket(10);
+
+        // packet type
+     
+        NET_WriteInt16(packet, NET_PACKET_TYPE_SYN);
+
+        // magic number
+
+        NET_WriteInt32(packet, NET_MAGIC_NUMBER);
+
+        // send to the server
+
+        NET_SendPacket(server_addr, packet);
+
+        NET_FreePacket(packet);
+
+        last_send_time = I_GetTimeMS();
+    }
+}
+
+// "Run" the client code: check for new packets, send packets as
+// needed
+
+void NET_ClientRun(void)
+{
+    net_addr_t *addr;
+    net_packet_t *packet;
+    
+    while (NET_RecvPacket(client_context, &addr, &packet))
+    {
+        // only accept packets from the server
+
+        if (addr == server_addr)
+        {
+            ClientParsePacket(packet);
+        }
+
+        NET_FreePacket(packet);
+    }
+
+    // send packets as needed
+
+    switch (client_state)
+    {
+        case CLIENT_STATE_CONNECTING:
+            ClientConnecting();
+            break;
+        case CLIENT_STATE_WAITING_START:
+            break;
+        case CLIENT_STATE_IN_GAME:
+            break;
+    }
+}
+
 // connect to a server
 
 boolean NET_ClientConnect(net_addr_t *addr)
 {
-    net_packet_t *packet;
-    int last_send_time = -1;
+    int start_time;
 
     server_addr = addr;
 
@@ -66,32 +184,41 @@
 
     // try to connect
  
-    // construct a SYN packet
+    client_state = CLIENT_STATE_CONNECTING;
+    last_send_time = -1;
 
-    packet = NET_NewPacket(10);
+    start_time = I_GetTimeMS();
 
-    // packet type
- 
-    NET_WriteInt16(packet, NET_PACKET_TYPE_SYN);
-
-    // magic number
-
-    NET_WriteInt32(packet, NET_MAGIC_NUMBER);
-
-    while (true)
+    while (client_state == CLIENT_STATE_CONNECTING)
     {
-        if (I_GetTime() - last_send_time > 35)
-        {
-            // resend packet
+        // time out after 5 seconds 
 
-            NET_SendPacket(addr, packet);
-            last_send_time = I_GetTime();
+        if (I_GetTime() - start_time > 5000)
+        {
+            break;
         }
 
+        // run client code
+
+        NET_ClientRun();
+        
         // run the server, just incase we are doing a loopback
         // connect
 
         NET_ServerRun();
+    }
+
+    if (client_state != CLIENT_STATE_CONNECTING)
+    {
+        // connected ok!
+
+        return true;
+    }
+    else
+    {
+        // failed to connect
+        
+        return false;
     }
 }
 
--- a/src/net_client.h
+++ b/src/net_client.h
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_client.h 232 2005-12-29 17:48:25Z fraggle $
+// $Id: net_client.h 233 2005-12-29 21:29:55Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2005/12/29 21:29:55  fraggle
+// Working client connect code
+//
 // Revision 1.1  2005/12/29 17:48:25  fraggle
 // Add initial client/server connect code.  Reorganise sources list in
 // Makefile.am.
@@ -34,7 +37,7 @@
 
 #include "net_defs.h"
 
-boolean NET_ClietConnect(net_addr_t *addr);
+boolean NET_ClientConnect(net_addr_t *addr);
 
 #endif /* #ifndef NET_CLIENT_H */
 
--- a/src/net_loop.c
+++ b/src/net_loop.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_loop.c 229 2005-10-30 19:56:15Z fraggle $
+// $Id: net_loop.c 233 2005-12-29 21:29:55Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2005/12/29 21:29:55  fraggle
+// Working client connect code
+//
 // Revision 1.1  2005/10/30 19:56:15  fraggle
 // Add foundation code for the new networking system
 //
@@ -99,7 +102,6 @@
 static boolean NET_CL_InitClient(void)
 {
     QueueInit(&client_queue);
-    client_addr.module = &net_loop_client_module;
 
     return true;
 }
@@ -125,6 +127,7 @@
     {
         *packet = popped;
         *addr = &client_addr;
+        client_addr.module = &net_loop_client_module;
         
         return true;
     }
@@ -143,6 +146,8 @@
 
 static net_addr_t *NET_CL_ResolveAddress(char *address)
 {
+    client_addr.module = &net_loop_client_module;
+
     return &client_addr;
 }
 
@@ -172,7 +177,6 @@
 static boolean NET_SV_InitServer(void)
 {
     QueueInit(&server_queue);
-    server_addr.module = &net_loop_server_module;
 
     return true;
 }
@@ -192,6 +196,7 @@
     {
         *packet = popped;
         *addr = &server_addr;
+        server_addr.module = &net_loop_server_module;
         
         return true;
     }
@@ -210,6 +215,7 @@
 
 static net_addr_t *NET_SV_ResolveAddress(char *address)
 {
+    server_addr.module = &net_loop_server_module;
     return &server_addr;
 }
 
--- a/src/net_server.c
+++ b/src/net_server.c
@@ -1,7 +1,7 @@
 // Emacs style mode select   -*- C++ -*- 
 //-----------------------------------------------------------------------------
 //
-// $Id: net_server.c 232 2005-12-29 17:48:25Z fraggle $
+// $Id: net_server.c 233 2005-12-29 21:29:55Z fraggle $
 //
 // Copyright(C) 2005 Simon Howard
 //
@@ -21,6 +21,9 @@
 // 02111-1307, USA.
 //
 // $Log$
+// Revision 1.2  2005/12/29 21:29:55  fraggle
+// Working client connect code
+//
 // Revision 1.1  2005/12/29 17:48:25  fraggle
 // Add initial client/server connect code.  Reorganise sources list in
 // Makefile.am.
@@ -80,7 +83,7 @@
 
     // read the magic number
 
-    if (!NET_ReadInt16(packet, &magic))
+    if (!NET_ReadInt32(packet, &magic))
     {
         return;
     }