|
|
1.1 ! root 1: // net.h -- quake's interface to the networking layer ! 2: ! 3: struct qsockaddr ! 4: { ! 5: short sa_family; ! 6: unsigned char sa_data[14]; ! 7: }; ! 8: ! 9: ! 10: #define NET_NAMELEN 64 ! 11: ! 12: #define NET_MAXMESSAGE 8192 ! 13: #define NET_HEADERSIZE (2 * sizeof(unsigned int)) ! 14: #define NET_DATAGRAMSIZE (MAX_DATAGRAM + NET_HEADERSIZE) ! 15: ! 16: // NetHeader flags ! 17: #define NETFLAG_LENGTH_MASK 0x0000ffff ! 18: #define NETFLAG_DATA 0x00010000 ! 19: #define NETFLAG_ACK 0x00020000 ! 20: #define NETFLAG_NAK 0x00040000 ! 21: #define NETFLAG_EOM 0x00080000 ! 22: #define NETFLAG_UNRELIABLE 0x00100000 ! 23: #define NETFLAG_CTL 0x80000000 ! 24: ! 25: ! 26: #define NET_PROTOCOL_VERSION 3 ! 27: ! 28: // This is the network info/connection protocol. It is used to find Quake ! 29: // servers, get info about them, and connect to them. Once connected, the ! 30: // Quake game protocol (documented elsewhere) is used. ! 31: // ! 32: // ! 33: // General notes: ! 34: // game_name is currently always "QUAKE", but is there so this same protocol ! 35: // can be used for future games as well; can you say Quake2? ! 36: // ! 37: // CCREQ_CONNECT ! 38: // string game_name "QUAKE" ! 39: // byte net_protocol_version NET_PROTOCOL_VERSION ! 40: // ! 41: // CCREQ_SERVER_INFO ! 42: // string game_name "QUAKE" ! 43: // byte net_protocol_version NET_PROTOCOL_VERSION ! 44: // ! 45: // CCREQ_PLAYER_INFO ! 46: // byte player_number ! 47: // ! 48: // CCREQ_RULE_INFO ! 49: // string rule ! 50: // ! 51: // ! 52: // ! 53: // CCREP_ACCEPT ! 54: // long port ! 55: // ! 56: // CCREP_REJECT ! 57: // string reason ! 58: // ! 59: // CCREP_SERVER_INFO ! 60: // string server_address ! 61: // string host_name ! 62: // string level_name ! 63: // byte current_players ! 64: // byte max_players ! 65: // byte protocol_version NET_PROTOCOL_VERSION ! 66: // ! 67: // CCREP_PLAYER_INFO ! 68: // byte player_number ! 69: // string name ! 70: // long colors ! 71: // long frags ! 72: // long connect_time ! 73: // string address ! 74: // ! 75: // CCREP_RULE_INFO ! 76: // string rule ! 77: // string value ! 78: ! 79: // note: ! 80: // There are two address forms used above. The short form is just a ! 81: // port number. The address that goes along with the port is defined as ! 82: // "whatever address you receive this reponse from". This lets us use ! 83: // the host OS to solve the problem of multiple host addresses (possibly ! 84: // with no routing between them); the host will use the right address ! 85: // when we reply to the inbound connection request. The long from is ! 86: // a full address and port in a string. It is used for returning the ! 87: // address of a server that is not running locally. ! 88: ! 89: #define CCREQ_CONNECT 0x01 ! 90: #define CCREQ_SERVER_INFO 0x02 ! 91: #define CCREQ_PLAYER_INFO 0x03 ! 92: #define CCREQ_RULE_INFO 0x04 ! 93: ! 94: #define CCREP_ACCEPT 0x81 ! 95: #define CCREP_REJECT 0x82 ! 96: #define CCREP_SERVER_INFO 0x83 ! 97: #define CCREP_PLAYER_INFO 0x84 ! 98: #define CCREP_RULE_INFO 0x85 ! 99: ! 100: typedef struct qsocket_s ! 101: { ! 102: struct qsocket_s *next; ! 103: double connecttime; ! 104: double lastMessageTime; ! 105: double lastSendTime; ! 106: ! 107: qboolean disconnected; ! 108: qboolean canSend; ! 109: qboolean sendNext; ! 110: ! 111: int driver; ! 112: int landriver; ! 113: int socket; ! 114: void *driverdata; ! 115: ! 116: unsigned int ackSequence; ! 117: unsigned int sendSequence; ! 118: unsigned int unreliableSendSequence; ! 119: int sendMessageLength; ! 120: byte sendMessage [NET_MAXMESSAGE]; ! 121: ! 122: unsigned int receiveSequence; ! 123: unsigned int unreliableReceiveSequence; ! 124: int receiveMessageLength; ! 125: byte receiveMessage [NET_MAXMESSAGE]; ! 126: ! 127: struct qsockaddr addr; ! 128: char address[NET_NAMELEN]; ! 129: ! 130: } qsocket_t; ! 131: ! 132: extern qsocket_t *net_activeSockets; ! 133: extern qsocket_t *net_freeSockets; ! 134: extern int net_numsockets; ! 135: ! 136: typedef struct ! 137: { ! 138: char *name; ! 139: qboolean initialized; ! 140: int controlSock; ! 141: int (*Init) (void); ! 142: void (*Shutdown) (void); ! 143: void (*Listen) (qboolean state); ! 144: int (*OpenSocket) (int port); ! 145: int (*CloseSocket) (int socket); ! 146: int (*Connect) (int socket, struct qsockaddr *addr); ! 147: int (*CheckNewConnections) (void); ! 148: int (*Read) (int socket, byte *buf, int len, struct qsockaddr *addr); ! 149: int (*Write) (int socket, byte *buf, int len, struct qsockaddr *addr); ! 150: int (*Broadcast) (int socket, byte *buf, int len); ! 151: char * (*AddrToString) (struct qsockaddr *addr); ! 152: int (*StringToAddr) (char *string, struct qsockaddr *addr); ! 153: int (*GetSocketAddr) (int socket, struct qsockaddr *addr); ! 154: int (*GetNameFromAddr) (struct qsockaddr *addr, char *name); ! 155: int (*GetAddrFromName) (char *name, struct qsockaddr *addr); ! 156: int (*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2); ! 157: int (*GetSocketPort) (struct qsockaddr *addr); ! 158: int (*SetSocketPort) (struct qsockaddr *addr, int port); ! 159: } net_landriver_t; ! 160: ! 161: #define MAX_NET_DRIVERS 8 ! 162: extern int net_numlandrivers; ! 163: extern net_landriver_t net_landrivers[MAX_NET_DRIVERS]; ! 164: ! 165: typedef struct ! 166: { ! 167: char *name; ! 168: qboolean initialized; ! 169: int (*Init) (void); ! 170: void (*Listen) (qboolean state); ! 171: void (*SearchForHosts) (qboolean xmit); ! 172: qsocket_t *(*Connect) (char *host); ! 173: qsocket_t *(*CheckNewConnections) (void); ! 174: int (*GetMessage) (qsocket_t *sock); ! 175: int (*SendMessage) (qsocket_t *sock, sizebuf_t *data); ! 176: int (*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data); ! 177: qboolean (*CanSendMessage) (qsocket_t *sock); ! 178: qboolean (*CanSendUnreliableMessage) (qsocket_t *sock); ! 179: void (*Close) (qsocket_t *sock); ! 180: void (*Shutdown) (void); ! 181: int controlSock; ! 182: } net_driver_t; ! 183: ! 184: extern int net_numdrivers; ! 185: extern net_driver_t net_drivers[MAX_NET_DRIVERS]; ! 186: ! 187: extern int DEFAULTnet_hostport; ! 188: extern int net_hostport; ! 189: ! 190: extern int net_driverlevel; ! 191: extern cvar_t hostname; ! 192: extern char playername[]; ! 193: extern int playercolor; ! 194: ! 195: extern int messagesSent; ! 196: extern int messagesReceived; ! 197: extern int unreliableMessagesSent; ! 198: extern int unreliableMessagesReceived; ! 199: ! 200: qsocket_t *NET_NewQSocket (void); ! 201: void NET_FreeQSocket(qsocket_t *); ! 202: double SetNetTime(void); ! 203: ! 204: ! 205: #define HOSTCACHESIZE 8 ! 206: ! 207: typedef struct ! 208: { ! 209: char name[16]; ! 210: char map[16]; ! 211: char cname[32]; ! 212: int users; ! 213: int maxusers; ! 214: int driver; ! 215: int ldriver; ! 216: struct qsockaddr addr; ! 217: } hostcache_t; ! 218: ! 219: extern int hostCacheCount; ! 220: extern hostcache_t hostcache[HOSTCACHESIZE]; ! 221: ! 222: #ifndef _WIN32 ! 223: #ifndef htonl ! 224: extern unsigned long htonl (unsigned long hostlong); ! 225: #endif ! 226: #ifndef htons ! 227: extern unsigned short htons (unsigned short hostshort); ! 228: #endif ! 229: #ifndef ntohl ! 230: extern unsigned long ntohl (unsigned long netlong); ! 231: #endif ! 232: #ifndef ntohs ! 233: extern unsigned short ntohs (unsigned short netshort); ! 234: #endif ! 235: #endif ! 236: ! 237: #ifdef IDGODS ! 238: qboolean IsID(struct qsockaddr *addr); ! 239: #endif ! 240: ! 241: //============================================================================ ! 242: // ! 243: // public network functions ! 244: // ! 245: //============================================================================ ! 246: ! 247: extern double net_time; ! 248: extern sizebuf_t net_message; ! 249: extern int net_activeconnections; ! 250: ! 251: void NET_Init (void); ! 252: void NET_Shutdown (void); ! 253: ! 254: struct qsocket_s *NET_CheckNewConnections (void); ! 255: // returns a new connection number if there is one pending, else -1 ! 256: ! 257: struct qsocket_s *NET_Connect (char *host); ! 258: // called by client to connect to a host. Returns -1 if not able to ! 259: ! 260: qboolean NET_CanSendMessage (qsocket_t *sock); ! 261: // Returns true or false if the given qsocket can currently accept a ! 262: // message to be transmitted. ! 263: ! 264: int NET_GetMessage (struct qsocket_s *sock); ! 265: // returns data in net_message sizebuf ! 266: // returns 0 if no data is waiting ! 267: // returns 1 if a message was received ! 268: // returns 2 if an unreliable message was received ! 269: // returns -1 if the connection died ! 270: ! 271: int NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data); ! 272: int NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data); ! 273: // returns 0 if the message connot be delivered reliably, but the connection ! 274: // is still considered valid ! 275: // returns 1 if the message was sent properly ! 276: // returns -1 if the connection died ! 277: ! 278: int NET_SendToAll(sizebuf_t *data, int blocktime); ! 279: // This is a reliable *blocking* send to all attached clients. ! 280: ! 281: ! 282: void NET_Close (struct qsocket_s *sock); ! 283: // if a dead connection is returned by a get or send function, this function ! 284: // should be called when it is convenient ! 285: ! 286: // Server calls when a client is kicked off for a game related misbehavior ! 287: // like an illegal protocal conversation. Client calls when disconnecting ! 288: // from a server. ! 289: // A netcon_t number will not be reused until this function is called for it ! 290: ! 291: void NET_Poll(void); ! 292: ! 293: ! 294: typedef struct _PollProcedure ! 295: { ! 296: struct _PollProcedure *next; ! 297: double nextTime; ! 298: void (*procedure)(); ! 299: void *arg; ! 300: } PollProcedure; ! 301: ! 302: void SchedulePollProcedure(PollProcedure *pp, double timeOffset); ! 303: ! 304: extern qboolean serialAvailable; ! 305: extern qboolean ipxAvailable; ! 306: extern qboolean tcpipAvailable; ! 307: extern char my_ipx_address[NET_NAMELEN]; ! 308: extern char my_tcpip_address[NET_NAMELEN]; ! 309: extern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem); ! 310: extern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem); ! 311: extern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup); ! 312: extern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup); ! 313: ! 314: extern qboolean slistInProgress; ! 315: extern qboolean slistSilent; ! 316: extern qboolean slistLocal; ! 317: ! 318: void NET_Slist_f (void);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.