| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203 |
- //
- // Copyright 2020 Electronic Arts Inc.
- //
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code is free
- // software: you can redistribute it and/or modify it under the terms of
- // the GNU General Public License as published by the Free Software Foundation,
- // either version 3 of the License, or (at your option) any later version.
- // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed
- // in the hope that it will be useful, but with permitted additional restrictions
- // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT
- // distributed with this program. You should have received a copy of the
- // GNU General Public License along with permitted additional restrictions
- // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
- /* $Header: /CounterStrike/IPXGCONN.H 1 3/03/97 10:24a Joe_bostic $ */
- /***************************************************************************
- ** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S **
- ***************************************************************************
- * *
- * Project Name : Command & Conquer *
- * *
- * File Name : IPXGCONN.H *
- * *
- * Programmer : Bill Randolph *
- * *
- * Start Date : December 19, 1994 *
- * *
- * Last Update : April 11, 1995 [BR] *
- * *
- *-------------------------------------------------------------------------*
- * *
- * This class is a special type of IPX Connection. It can talk to more *
- * than one system at a time. It can Broadcast packets to all systems, *
- * or send a packet to one individual system. The packets it sends to *
- * individual systems can be DATA_NOACK or DATA_ACK packets, but the *
- * packets broadcast have to be DATA_NOACK packets. This class is for *
- * only the crudest "Who-are-you" type of network communications. Once *
- * the IPX Address of another system is identified, a "real" IPX *
- * Connection should be created, & further communications done through it. *
- * *
- * This means that the packet ID field no longer can be used to detect *
- * resends, since the receive queue may receive a lot more packets than *
- * we send out. So, re-sends cannot be detected; the application must be *
- * designed so that it can handle multiple copies of the same packet. *
- * *
- * The class uses a slightly different header from the normal Connections; *
- * this header includes the ProductID of the sender, so multiple *
- * applications can share the same socket, but by using different product *
- * ID's, can distinguish between their own packets & others. *
- * *
- * Because of this additional header, and because Receive ACK/Retry logic *
- * is different (we can't detect resends), the following routines are *
- * overloaded: *
- * Send_Packet: must embed the product ID into the packet header *
- * Receive_Packet: must detect resends via the LastAddress & *
- * LastPacketID arrays. This class doesn't ACK *
- * packets until Service_Receive_Queue is called; *
- * the parent classes ACK the packet when it's *
- * received. *
- * Get_Packet: extracts the product ID from the header; *
- * doesn't care about reading packets in order *
- * Send is capable of broadcasting the packet, or sending *
- * to a specific address *
- * *
- * This class also has the ability to cross a Novell Network Bridge. *
- * You provide the class with the bridge address, and subsequent *
- * broadcasts are sent across the bridge as well as to the local network. *
- * Address-specific sends contain the destination network's address, *
- * so they cross a bridge automatically; it's just the broadcasts *
- * that need to know the bridge address. *
- * *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #ifndef IPXGLOBALCONN_H
- #define IPXGLOBALCONN_H
- #include "ipxconn.h"
- /*
- ********************************** Defines **********************************
- */
- //---------------------------------------------------------------------------
- // This is the header for Global Connection messages. It includes the usual
- // "standard" header that the other connections do; but it also includes an
- // IPX address field, so the application can get the address of the sender
- // of this message. This address field must be provided in by the IPX
- // Connection Manager class, when it calls this class's Receive_Packet
- // function.
- //---------------------------------------------------------------------------
- typedef struct {
- CommHeaderType Header;
- unsigned short ProductID;
- } GlobalHeaderType;
- /*
- ***************************** Class Declaration *****************************
- */
- class IPXGlobalConnClass : public IPXConnClass
- {
- //------------------------------------------------------------------------
- // Public Interface
- //------------------------------------------------------------------------
- public:
- //.....................................................................
- // Some useful enums:
- //.....................................................................
- enum GlobalConnectionEnum {
- //..................................................................
- // This is the magic number for all Global Connections. Having the
- // same magic number across products lets us ID different products
- // on the net. If you change the fundamental connection protocol,
- // you must use a different magic number.
- //..................................................................
- //GLOBAL_MAGICNUM = 0x1234, // used for C&C 1
- GLOBAL_MAGICNUM = 0x1235, // used for C&C 0
- //..................................................................
- // These are the values used for the ProductID field in the Global
- // Message structure. It also should be the Magic Number used for
- // the private connections within that product.
- // This list should be continually updated & kept current. Never
- // ever ever use an old product ID for your product!
- //..................................................................
- COMMAND_AND_CONQUER = 0xaa01,
- COMMAND_AND_CONQUER0 = 0xaa00
- };
- //.....................................................................
- // Constructor/destructor.
- //.....................................................................
- IPXGlobalConnClass (int numsend, int numrecieve, int maxlen,
- unsigned short product_id);
- virtual ~IPXGlobalConnClass () {};
- //.....................................................................
- // Send/Receive routines.
- //.....................................................................
- virtual int Send_Packet (void * buf, int buflen,
- IPXAddressClass *address, int ack_req);
- virtual int Receive_Packet (void * buf, int buflen,
- IPXAddressClass *address);
- virtual int Get_Packet (void * buf, int *buflen,
- IPXAddressClass *address, unsigned short *product_id);
- //.....................................................................
- // This is for telling the connection it can cross a bridge.
- //.....................................................................
- void Set_Bridge (NetNumType bridge);
- //.....................................................................
- // The Product ID for this product.
- //.....................................................................
- unsigned short ProductID;
- //.....................................................................
- // This describes the address of a bridge we have to cross. This class
- // supports crossing only one bridge. Storing the bridge's network
- // number allows us to obtain its local target address only once, then
- // re-use it.
- //.....................................................................
- NetNumType BridgeNet;
- NetNodeType BridgeNode;
- int IsBridge;
- //------------------------------------------------------------------------
- // Protected Interface
- //------------------------------------------------------------------------
- protected:
- //.....................................................................
- // This is the overloaded Send routine declared in ConnectionClass, and
- // used in SequencedConnClass. This special version sends to the address
- // stored in the extra buffer within the Queue.
- //.....................................................................
- virtual int Send (char *buf, int buflen, void *extrabuf, int extralen);
- //.....................................................................
- // This routine is overloaded from SequencedConnClass, because the
- // Global Connection needs to ACK its packets differently from the
- // other connections.
- //.....................................................................
- virtual int Service_Receive_Queue (void);
- private:
- //.....................................................................
- // Since we can't detect resends by using the PacketID (since we're
- // receiving packets from a variety of sources, all using different
- // ID's), we'll have to remember the last 'n' packet addresses & id's
- // for comparison purposes.
- // Note that, if network traffic is heavy, it's still possible for an
- // app to receive the same packet twice!
- //.....................................................................
- IPXAddressClass LastAddress[4]; // array of last 4 addresses
- unsigned long LastPacketID[4]; // array of last 4 packet ID's
- int LastRXIndex; // index of next avail pos
- };
- #endif
- /*************************** end of ipxgconn.h *****************************/
|