Fix for the problem that SDL applications exited
[AROS-Contrib.git] / Games / Quake / net.h
blobaf461256b6d1197fd13103735667206d0d516a08
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 // net.h -- quake's interface to the networking layer
22 struct qsockaddr
24 short sa_family;
25 unsigned char sa_data[14];
29 #define NET_NAMELEN 64
31 #define NET_MAXMESSAGE 8192
32 #define NET_HEADERSIZE (2 * sizeof(unsigned int))
33 #define NET_DATAGRAMSIZE (MAX_DATAGRAM + NET_HEADERSIZE)
35 // NetHeader flags
36 #define NETFLAG_LENGTH_MASK 0x0000ffff
37 #define NETFLAG_DATA 0x00010000
38 #define NETFLAG_ACK 0x00020000
39 #define NETFLAG_NAK 0x00040000
40 #define NETFLAG_EOM 0x00080000
41 #define NETFLAG_UNRELIABLE 0x00100000
42 #define NETFLAG_CTL 0x80000000
45 #define NET_PROTOCOL_VERSION 3
47 // This is the network info/connection protocol. It is used to find Quake
48 // servers, get info about them, and connect to them. Once connected, the
49 // Quake game protocol (documented elsewhere) is used.
52 // General notes:
53 // game_name is currently always "QUAKE", but is there so this same protocol
54 // can be used for future games as well; can you say Quake2?
56 // CCREQ_CONNECT
57 // string game_name "QUAKE"
58 // byte net_protocol_version NET_PROTOCOL_VERSION
60 // CCREQ_SERVER_INFO
61 // string game_name "QUAKE"
62 // byte net_protocol_version NET_PROTOCOL_VERSION
64 // CCREQ_PLAYER_INFO
65 // byte player_number
67 // CCREQ_RULE_INFO
68 // string rule
72 // CCREP_ACCEPT
73 // long port
75 // CCREP_REJECT
76 // string reason
78 // CCREP_SERVER_INFO
79 // string server_address
80 // string host_name
81 // string level_name
82 // byte current_players
83 // byte max_players
84 // byte protocol_version NET_PROTOCOL_VERSION
86 // CCREP_PLAYER_INFO
87 // byte player_number
88 // string name
89 // long colors
90 // long frags
91 // long connect_time
92 // string address
94 // CCREP_RULE_INFO
95 // string rule
96 // string value
98 // note:
99 // There are two address forms used above. The short form is just a
100 // port number. The address that goes along with the port is defined as
101 // "whatever address you receive this reponse from". This lets us use
102 // the host OS to solve the problem of multiple host addresses (possibly
103 // with no routing between them); the host will use the right address
104 // when we reply to the inbound connection request. The long from is
105 // a full address and port in a string. It is used for returning the
106 // address of a server that is not running locally.
108 #define CCREQ_CONNECT 0x01
109 #define CCREQ_SERVER_INFO 0x02
110 #define CCREQ_PLAYER_INFO 0x03
111 #define CCREQ_RULE_INFO 0x04
113 #define CCREP_ACCEPT 0x81
114 #define CCREP_REJECT 0x82
115 #define CCREP_SERVER_INFO 0x83
116 #define CCREP_PLAYER_INFO 0x84
117 #define CCREP_RULE_INFO 0x85
119 typedef struct qsocket_s
121 struct qsocket_s *next;
122 double connecttime;
123 double lastMessageTime;
124 double lastSendTime;
126 qboolean disconnected;
127 qboolean canSend;
128 qboolean sendNext;
130 int driver;
131 int landriver;
132 int socket;
133 void *driverdata;
135 unsigned int ackSequence;
136 unsigned int sendSequence;
137 unsigned int unreliableSendSequence;
138 int sendMessageLength;
139 byte sendMessage [NET_MAXMESSAGE];
141 unsigned int receiveSequence;
142 unsigned int unreliableReceiveSequence;
143 int receiveMessageLength;
144 byte receiveMessage [NET_MAXMESSAGE];
146 struct qsockaddr addr;
147 char address[NET_NAMELEN];
149 } qsocket_t;
151 extern qsocket_t *net_activeSockets;
152 extern qsocket_t *net_freeSockets;
153 extern int net_numsockets;
155 typedef struct
157 char *name;
158 qboolean initialized;
159 int controlSock;
160 int (*Init) (void);
161 void (*Shutdown) (void);
162 void (*Listen) (qboolean state);
163 int (*OpenSocket) (int port);
164 int (*CloseSocket) (int socket);
165 int (*Connect) (int socket, struct qsockaddr *addr);
166 int (*CheckNewConnections) (void);
167 int (*Read) (int socket, byte *buf, int len, struct qsockaddr *addr);
168 int (*Write) (int socket, byte *buf, int len, struct qsockaddr *addr);
169 int (*Broadcast) (int socket, byte *buf, int len);
170 char * (*AddrToString) (struct qsockaddr *addr);
171 int (*StringToAddr) (char *string, struct qsockaddr *addr);
172 int (*GetSocketAddr) (int socket, struct qsockaddr *addr);
173 int (*GetNameFromAddr) (struct qsockaddr *addr, char *name);
174 int (*GetAddrFromName) (char *name, struct qsockaddr *addr);
175 int (*AddrCompare) (struct qsockaddr *addr1, struct qsockaddr *addr2);
176 int (*GetSocketPort) (struct qsockaddr *addr);
177 int (*SetSocketPort) (struct qsockaddr *addr, int port);
178 } net_landriver_t;
180 #define MAX_NET_DRIVERS 8
181 extern int net_numlandrivers;
182 extern net_landriver_t net_landrivers[MAX_NET_DRIVERS];
184 typedef struct
186 char *name;
187 qboolean initialized;
188 int (*Init) (void);
189 void (*Listen) (qboolean state);
190 void (*SearchForHosts) (qboolean xmit);
191 qsocket_t *(*Connect) (char *host);
192 qsocket_t *(*CheckNewConnections) (void);
193 int (*QGetMessage) (qsocket_t *sock);
194 int (*QSendMessage) (qsocket_t *sock, sizebuf_t *data);
195 int (*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data);
196 qboolean (*CanSendMessage) (qsocket_t *sock);
197 qboolean (*CanSendUnreliableMessage) (qsocket_t *sock);
198 void (*Close) (qsocket_t *sock);
199 void (*Shutdown) (void);
200 int controlSock;
201 } net_driver_t;
203 extern int net_numdrivers;
204 extern net_driver_t net_drivers[MAX_NET_DRIVERS];
206 extern int DEFAULTnet_hostport;
207 extern int net_hostport;
209 extern int net_driverlevel;
210 extern cvar_t hostname;
211 extern char playername[];
212 extern int playercolor;
214 extern int messagesSent;
215 extern int messagesReceived;
216 extern int unreliableMessagesSent;
217 extern int unreliableMessagesReceived;
219 qsocket_t *NET_NewQSocket (void);
220 void NET_FreeQSocket(qsocket_t *);
221 double SetNetTime(void);
224 #define HOSTCACHESIZE 8
226 typedef struct
228 char name[16];
229 char map[16];
230 char cname[32];
231 int users;
232 int maxusers;
233 int driver;
234 int ldriver;
235 struct qsockaddr addr;
236 } hostcache_t;
238 extern int hostCacheCount;
239 extern hostcache_t hostcache[HOSTCACHESIZE];
241 #if !defined(_WIN32 ) && !defined (__linux__) && !defined (__sun__)
242 #ifndef htonl
243 extern unsigned long htonl (unsigned long hostlong);
244 #endif
245 #ifndef htons
246 extern unsigned short htons (unsigned short hostshort);
247 #endif
248 #ifndef ntohl
249 extern unsigned long ntohl (unsigned long netlong);
250 #endif
251 #ifndef ntohs
252 extern unsigned short ntohs (unsigned short netshort);
253 #endif
254 #endif
256 #ifdef IDGODS
257 qboolean IsID(struct qsockaddr *addr);
258 #endif
260 //============================================================================
262 // public network functions
264 //============================================================================
266 extern double net_time;
267 extern sizebuf_t net_message;
268 extern int net_activeconnections;
270 void NET_Init (void);
271 void NET_Shutdown (void);
273 struct qsocket_s *NET_CheckNewConnections (void);
274 // returns a new connection number if there is one pending, else -1
276 struct qsocket_s *NET_Connect (char *host);
277 // called by client to connect to a host. Returns -1 if not able to
279 qboolean NET_CanSendMessage (qsocket_t *sock);
280 // Returns true or false if the given qsocket can currently accept a
281 // message to be transmitted.
283 int NET_GetMessage (struct qsocket_s *sock);
284 // returns data in net_message sizebuf
285 // returns 0 if no data is waiting
286 // returns 1 if a message was received
287 // returns 2 if an unreliable message was received
288 // returns -1 if the connection died
290 int NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
291 int NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
292 // returns 0 if the message connot be delivered reliably, but the connection
293 // is still considered valid
294 // returns 1 if the message was sent properly
295 // returns -1 if the connection died
297 int NET_SendToAll(sizebuf_t *data, int blocktime);
298 // This is a reliable *blocking* send to all attached clients.
301 void NET_Close (struct qsocket_s *sock);
302 // if a dead connection is returned by a get or send function, this function
303 // should be called when it is convenient
305 // Server calls when a client is kicked off for a game related misbehavior
306 // like an illegal protocal conversation. Client calls when disconnecting
307 // from a server.
308 // A netcon_t number will not be reused until this function is called for it
310 void NET_Poll(void);
313 typedef struct _PollProcedure
315 struct _PollProcedure *next;
316 double nextTime;
317 void (*procedure)();
318 void *arg;
319 } PollProcedure;
321 void SchedulePollProcedure(PollProcedure *pp, double timeOffset);
323 extern qboolean serialAvailable;
324 extern qboolean ipxAvailable;
325 extern qboolean tcpipAvailable;
326 extern char my_ipx_address[NET_NAMELEN];
327 extern char my_tcpip_address[NET_NAMELEN];
328 extern void (*GetComPortConfig) (int portNumber, int *port, int *irq, int *baud, qboolean *useModem);
329 extern void (*SetComPortConfig) (int portNumber, int port, int irq, int baud, qboolean useModem);
330 extern void (*GetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
331 extern void (*SetModemConfig) (int portNumber, char *dialType, char *clear, char *init, char *hangup);
333 extern qboolean slistInProgress;
334 extern qboolean slistSilent;
335 extern qboolean slistLocal;
337 void NET_Slist_f (void);