]> icculus.org git repositories - divverent/darkplaces.git/blob - net.h
added a newline to the end
[divverent/darkplaces.git] / net.h
1 /*
2 Copyright (C) 1996-1997 Id Software, Inc.
3
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.
8
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.  
12
13 See the GNU General Public License for more details.
14
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.
18
19 */
20 // net.h -- quake's interface to the networking layer
21
22 struct qsockaddr
23 {
24         short sa_family;
25         unsigned char sa_data[14];
26 };
27
28
29 #define NET_NAMELEN                     64
30
31 #define NET_MAXMESSAGE          16384
32 #define NET_HEADERSIZE          (2 * sizeof(unsigned int))
33 #define NET_DATAGRAMSIZE        (MAX_DATAGRAM + NET_HEADERSIZE)
34
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
43
44
45 #define NET_PROTOCOL_VERSION    3
46
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.
50 //
51 //
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?
55 //
56 // CCREQ_CONNECT
57 //              string  game_name                               "QUAKE"
58 //              byte    net_protocol_version    NET_PROTOCOL_VERSION
59 //
60 // CCREQ_SERVER_INFO
61 //              string  game_name                               "QUAKE"
62 //              byte    net_protocol_version    NET_PROTOCOL_VERSION
63 //
64 // CCREQ_PLAYER_INFO
65 //              byte    player_number
66 //
67 // CCREQ_RULE_INFO
68 //              string  rule
69 //
70 //
71 //
72 // CCREP_ACCEPT
73 //              long    port
74 //
75 // CCREP_REJECT
76 //              string  reason
77 //
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
85 //
86 // CCREP_PLAYER_INFO
87 //              byte    player_number
88 //              string  name
89 //              long    colors
90 //              long    frags
91 //              long    connect_time
92 //              string  address
93 //
94 // CCREP_RULE_INFO
95 //              string  rule
96 //              string  value
97
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.
107
108 #define CCREQ_CONNECT           0x01
109 #define CCREQ_SERVER_INFO       0x02
110 #define CCREQ_PLAYER_INFO       0x03
111 #define CCREQ_RULE_INFO         0x04
112
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
118
119 typedef struct qsocket_s
120 {
121         struct qsocket_s        *next;
122         double                  connecttime;
123         double                  lastMessageTime;
124         double                  lastSendTime;
125
126         qboolean                disconnected;
127         qboolean                canSend;
128         qboolean                sendNext;
129         
130         int                             driver;
131         int                             landriver;
132         int                             socket;
133         void                    *driverdata;
134
135         unsigned int    ackSequence;
136         unsigned int    sendSequence;
137         unsigned int    unreliableSendSequence;
138         int                             sendMessageLength;
139         byte                    sendMessage [NET_MAXMESSAGE];
140
141         unsigned int    receiveSequence;
142         unsigned int    unreliableReceiveSequence;
143         int                             receiveMessageLength;
144         byte                    receiveMessage [NET_MAXMESSAGE];
145
146         struct qsockaddr        addr;
147         char                            address[NET_NAMELEN];
148
149 } qsocket_t;
150
151 extern qsocket_t        *net_activeSockets;
152 extern qsocket_t        *net_freeSockets;
153 extern int                      net_numsockets;
154
155 typedef struct
156 {
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;
179
180 #define MAX_NET_DRIVERS         8
181 extern int                              net_numlandrivers;
182 extern net_landriver_t  net_landrivers[MAX_NET_DRIVERS];
183
184 typedef struct
185 {
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;
202
203 extern int                      net_numdrivers;
204 extern net_driver_t     net_drivers[MAX_NET_DRIVERS];
205
206 extern int                      DEFAULTnet_hostport;
207 extern int                      net_hostport;
208
209 extern int net_driverlevel;
210 extern cvar_t           hostname;
211 extern char                     playername[];
212 extern int                      playercolor;
213
214 extern int              messagesSent;
215 extern int              messagesReceived;
216 extern int              unreliableMessagesSent;
217 extern int              unreliableMessagesReceived;
218
219 qsocket_t *NET_NewQSocket (void);
220 void NET_FreeQSocket(qsocket_t *);
221 double SetNetTime(void);
222
223
224 #define HOSTCACHESIZE   8
225
226 typedef struct
227 {
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;
237
238 extern int hostCacheCount;
239 extern hostcache_t hostcache[HOSTCACHESIZE];
240
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
255
256 //============================================================================
257 //
258 // public network functions
259 //
260 //============================================================================
261
262 extern  double          net_time;
263 extern  sizebuf_t       net_message;
264 extern  int                     net_activeconnections;
265
266 void            NET_Init (void);
267 void            NET_Shutdown (void);
268
269 struct qsocket_s        *NET_CheckNewConnections (void);
270 // returns a new connection number if there is one pending, else -1
271
272 struct qsocket_s        *NET_Connect (char *host);
273 // called by client to connect to a host.  Returns -1 if not able to
274
275 qboolean NET_CanSendMessage (qsocket_t *sock);
276 // Returns true or false if the given qsocket can currently accept a
277 // message to be transmitted.
278
279 int                     NET_GetMessage (struct qsocket_s *sock);
280 // returns data in net_message sizebuf
281 // returns 0 if no data is waiting
282 // returns 1 if a message was received
283 // returns 2 if an unreliable message was received
284 // returns -1 if the connection died
285
286 int                     NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data);
287 int                     NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data);
288 // returns 0 if the message connot be delivered reliably, but the connection
289 //              is still considered valid
290 // returns 1 if the message was sent properly
291 // returns -1 if the connection died
292
293 int                     NET_SendToAll(sizebuf_t *data, int blocktime);
294 // This is a reliable *blocking* send to all attached clients.
295
296
297 void            NET_Close (struct qsocket_s *sock);
298 // if a dead connection is returned by a get or send function, this function
299 // should be called when it is convenient
300
301 // Server calls when a client is kicked off for a game related misbehavior
302 // like an illegal protocal conversation.  Client calls when disconnecting
303 // from a server.
304 // A netcon_t number will not be reused until this function is called for it
305
306 void NET_Poll(void);
307
308
309 typedef struct _PollProcedure
310 {
311         struct _PollProcedure   *next;
312         double                                  nextTime;
313         void                                    (*procedure)();
314         void                                    *arg;
315 } PollProcedure;
316
317 void SchedulePollProcedure(PollProcedure *pp, double timeOffset);
318
319 extern  qboolean        ipxAvailable;
320 extern  qboolean        tcpipAvailable;
321 extern  char            my_ipx_address[NET_NAMELEN];
322 extern  char            my_tcpip_address[NET_NAMELEN];
323
324 extern  qboolean        slistInProgress;
325 extern  qboolean        slistSilent;
326 extern  qboolean        slistLocal;
327
328 extern cvar_t hostname;
329
330 void NET_Slist_f (void);