diff --git a/src/include/netconnect.h b/src/include/netconnect.h index 9d8415a7b..4b3e1baf8 100644 --- a/src/include/netconnect.h +++ b/src/include/netconnect.h @@ -207,7 +207,7 @@ extern void NetworkInitClientConnect(void); /// Setup network connect state mach extern void NetworkExitClientConnect(void); /// Terminate network connect state machine for clients extern void NetworkInitServerConnect(void); /// Setup network connect state machine for the server extern void NetworkExitServerConnect(void); /// Terminate network connect state machine for the server -extern void NetworkParseSetupEvent(const char *buf, int size); /// Parse a network connect event +extern int NetworkParseSetupEvent(const char *buf, int size); /// Parse a network connect event extern int NetworkSetupServerAddress(const char *serveraddr); /// Menu: Setup the server IP extern void NetworkProcessClientRequest(void); /// Menu Loop: Send out client request messages extern void NetworkProcessServerRequest(void); /// Menu Loop: Send out server request messages diff --git a/src/network/netconnect.cpp b/src/network/netconnect.cpp index 6bd7e3727..7473828b2 100644 --- a/src/network/netconnect.cpp +++ b/src/network/netconnect.cpp @@ -801,8 +801,9 @@ global void NetworkProcessServerRequest(void) } } +IfDebug( /** -** Parse a network menu packet in client disconneccted state. +** Parse a network menu packet in client disconnected state. ** ** @param msg message received */ @@ -812,9 +813,10 @@ local void ClientParseDisconnected( DebugLevel0Fn("ccs_disconnected: Server sending GoodBye dups %d\n" _C_ msg->SubType); } +); /** -** FIXME: docu +** Parse a network menu packet in client detaching state. ** ** @param msg message received */ @@ -835,7 +837,7 @@ local void ClientParseDetaching(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client connecting state. ** ** @param msg message received */ @@ -909,19 +911,18 @@ local void ClientParseConnecting(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client connected state. ** ** @param msg message received */ local void ClientParseConnected(const InitMessage* msg) { + int pathlen; + switch(msg->SubType) { - int pathlen; case ICMMap: // Server has sent us new map info - sprintf(ScenSelectFullPath, "%s/", FreeCraftLibPath); - // FIXME: pathlen = sprintf should work? - pathlen = strlen(ScenSelectFullPath); + pathlen = sprintf(ScenSelectFullPath, "%s/", FreeCraftLibPath); memcpy(ScenSelectFullPath+pathlen, msg->u.MapPath, 256); ScenSelectFullPath[pathlen+255] = 0; if (NetClientSelectScenario()) { @@ -952,7 +953,7 @@ local void ClientParseConnected(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client initial mapinfo state. ** ** @param msg message received */ @@ -975,7 +976,7 @@ local void ClientParseMapInfo(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client synced state. ** ** @param msg message received */ @@ -993,7 +994,7 @@ local void ClientParseSynced(const InitMessage* msg) NetStateMsgCnt = 0; break; - case ICMConfig: // Server gives the go ahead.. + case ICMConfig: // Server gives the go ahead.. - start game DebugLevel0Fn("ccs_synced: Config subtype %d received - starting\n" _C_ msg->SubType); HostsCount = 0; for (i = 0; i < msg->HostsCount - 1; ++i) { @@ -1040,7 +1041,7 @@ local void ClientParseSynced(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client async state. ** ** @param msg message received */ @@ -1077,7 +1078,7 @@ local void ClientParseAsync(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu packet in client final goahead waiting state. ** ** @param msg message received */ @@ -1090,7 +1091,7 @@ local void ClientParseGoAhead(const InitMessage* msg) break; case ICMState: // Server has sent final state info - DebugLevel3Fn("ccs_goahead: Final State subtype %d received - starting\n" _C_ msg->SubType); + DebugLevel0Fn("ccs_goahead: Final State subtype %d received - starting\n" _C_ msg->SubType); ServerSetupState = msg->u.State; NetLocalState = ccs_started; NetStateMsgCnt = 0; @@ -1103,7 +1104,7 @@ local void ClientParseGoAhead(const InitMessage* msg) } /** -** FIXME: docu +** Parse a network menu AreYouThere keepalive packet and reply IAmHere. ** ** @param msg message received */ @@ -1117,7 +1118,7 @@ local void ClientParseAreYouThere(const InitMessage* msg __attribute__((unused)) } /** -** FIXME: docu +** Parse a network menu Bad Map reply from server. ** ** @param msg message received */ @@ -1135,6 +1136,7 @@ local void ClientParseBadMap(const InitMessage* msg __attribute__((unused))) NetConnectRunning = 0; // End the menu.. } + /** ** Parse the initial 'Hello' message of new client that wants to join the game ** @@ -1559,16 +1561,11 @@ local int CheckVersions(const InitMessage* msg) ** Parse a Network menu packet. ** ** @param msg message received -** @param size size of the received packet. */ -local void NetworkParseMenuPacket(const InitMessage *msg, int size) +local void NetworkParseMenuPacket(const InitMessage *msg) { - if (msg->Type > MessageInitConfig || size != sizeof(*msg)) { - DebugLevel0Fn("Wrong message\n"); - return; - } - DebugLevel0Fn("Received %s Init Message %d:%d (%d) from %d.%d.%d.%d:%d (%ld)\n" _C_ - icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ size _C_ NIPQUAD(ntohl(NetLastHost)) _C_ + DebugLevel0Fn("Received %s Init Message %d:%d from %d.%d.%d.%d:%d (%ld)\n" _C_ + icmsgsubtypenames[msg->SubType] _C_ msg->Type _C_ msg->SubType _C_ NIPQUAD(ntohl(NetLastHost)) _C_ ntohs(NetLastPort) _C_ FrameCounter); if (NetConnectRunning == 2) { // client @@ -1585,7 +1582,9 @@ local void NetworkParseMenuPacket(const InitMessage *msg, int size) } switch(NetLocalState) { case ccs_disconnected: +IfDebug( ClientParseDisconnected(msg); +); break; case ccs_detaching: @@ -1692,33 +1691,27 @@ local void NetworkParseMenuPacket(const InitMessage *msg, int size) ** ** @param buf Packet received ** @param size size of the received packet. +** +** @return 1 if packet is an InitConfig message, 0 otherwise */ -global void NetworkParseSetupEvent(const char *buf, int size) +global int NetworkParseSetupEvent(const char *buf, int size) { - NetworkPacket *packet; + const InitMessage *msg = (const InitMessage *)buf; - if (InterfaceState == IfaceStateMenu && NetConnectRunning) { - NetworkParseMenuPacket((const InitMessage *)buf, size); - return; + if (msg->Type > MessageInitConfig || size != sizeof(*msg)) { + if (NetConnectRunning == 2 && NetLocalState == ccs_started) { + // Client has acked ready to start and receives first real network packed. + // This indicates game has been started by server, so do the same for client. + NetConnectRunning = 0; // End the menu.. + } + DebugLevel3Fn("Wrong message\n"); + return 0; } - packet = (NetworkPacket *)buf; - if (packet->Commands[0].Type == MessageInitConfig - && size == sizeof(InitMessage)) { - Acknowledge acknowledge; - - DebugLevel0Fn("Received late clients\n"); - - // Acknowledge the packets. - acknowledge.Type = MessageInitReply; - size = NetSendUDP(NetworkFildes, NetLastHost, NetLastPort, &acknowledge, - sizeof(acknowledge)); - DebugLevel0Fn("Sending config ack (%d)\n" _C_ size); - return; - } - if (packet->Commands[0].Type == MessageInitReply) { - DebugLevel0Fn("late init reply\n"); - return; + if (InterfaceState == IfaceStateMenu) { + NetworkParseMenuPacket(msg); + return 1; } + return 0; } //@} diff --git a/src/network/network.cpp b/src/network/network.cpp index b63cfc734..e76ee88ec 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -635,9 +635,9 @@ global void NetworkEvent(void) // // Setup messages // - if (packet->Commands[0].Type <= MessageInitConfig) { - NetworkParseSetupEvent(buf, i); - return; + if (NetConnectRunning) { + if (NetworkParseSetupEvent(buf, i)) + return; } // @@ -647,6 +647,7 @@ global void NetworkEvent(void) DebugLevel0Fn("Bad packet\n"); return; } + for (i = 0; i < HostsCount; ++i) { if (Hosts[i].Host == NetLastHost && Hosts[i].Port == NetLastPort) { break;