]> icculus.org git repositories - taylor/freespace2.git/blob - include/psnet2.h
More progress (I hate psnet2)
[taylor/freespace2.git] / include / psnet2.h
1 /*
2  * $Logfile: /Freespace2/code/Network/Psnet2.h $
3  * $Revision$
4  * $Date$
5  * $Author$
6  *
7  * Header file for the application level network-interface.
8  *
9  * $Log$
10  * Revision 1.3  2002/05/26 21:27:53  theoddone33
11  * More progress (I hate psnet2)
12  *
13  * Revision 1.2  2002/05/26 20:22:48  theoddone33
14  * Most of network/ works
15  *
16  * Revision 1.1.1.1  2002/05/03 03:28:12  root
17  * Initial import.
18  *
19  * 
20  * 9     8/16/99 4:06p Dave
21  * Big honking checkin.
22  * 
23  * 8     7/28/99 11:46a Dave
24  * Put in FS2_DEMO defines for port stuff.
25  * 
26  * 7     6/25/99 11:59a Dave
27  * Multi options screen.
28  * 
29  * 6     6/07/99 9:51p Dave
30  * Consolidated all multiplayer ports into one.
31  * 
32  * 5     3/09/99 6:24p Dave
33  * More work on object update revamping. Identified several sources of
34  * unnecessary bandwidth.
35  * 
36  * 4     11/19/98 4:19p Dave
37  * Put IPX sockets back in psnet. Consolidated all multiplayer config
38  * files into one.
39  * 
40  * 3     11/19/98 8:04a Dave
41  * Full support for D3-style reliable sockets. Revamped packet lag/loss
42  * system, made it receiver side and at the lowest possible level.
43  * 
44  * $NoKeywords: $
45  */
46
47
48 #ifndef _PSNET2_H
49 #define _PSNET2_H
50
51 #include "pstypes.h"
52
53 // -------------------------------------------------------------------------------------------------------
54 // PSNET 2 DEFINES/VARS
55 //
56
57 #define NET_NONE                0               // if no protocol is active or none are selected
58 #define NET_TCP         1
59 #define NET_IPX         2
60 #define NET_VMT         3
61
62 #define MAX_PACKET_SIZE         512
63
64 #ifdef FS2_DEMO
65         #define DEFAULT_GAME_PORT 7802
66 #else
67         #define DEFAULT_GAME_PORT 7808
68 #endif
69
70 typedef struct net_addr_s {
71         uint    type;                   // See NET_ defines above
72         ubyte   net_id[4];      // used for IPX only
73         ubyte addr[6];          // address (first 4 used when IP, all 6 used when IPX)
74         short port;                     
75 } net_addr_t;
76
77 // define these in such a manner that a call to psnet_send_reliable is exactly the same and the new code in unobtrusive
78 typedef uint PSNET_SOCKET;
79 typedef uint PSNET_SOCKET_RELIABLE;
80 #undef INVALID_SOCKET
81 #define INVALID_SOCKET (PSNET_SOCKET)(~0)
82
83 // defines for protocol overheads
84 #define UDP_HEADER_SIZE                                         34
85 #define TCP_HEADER_SIZE                                         40
86 #define TCP_HEADER_SIZE_COMPRESSED              6
87
88 // define values for network errors when trying to enter the ready room
89 #define NETWORK_ERROR_NONE                                      0
90 #define NETWORK_ERROR_NO_TYPE                           -1
91 #define NETWORK_ERROR_NO_WINSOCK                        -2
92 #define NETWORK_ERROR_NO_PROTOCOL               -3
93 #define NETWORK_ERROR_RELIABLE                  -4
94 #define NETWORK_ERROR_CONNECT_TO_ISP    -5
95 #define NETWORK_ERROR_LAN_AND_RAS               -6
96
97 // psnet packet types
98 #define PSNET_NUM_TYPES                                         5
99 #define PSNET_TYPE_UNRELIABLE                           0
100 #define PSNET_TYPE_RELIABLE                             1
101 #define PSNET_TYPE_USER_TRACKER                 2
102 #define PSNET_TYPE_GAME_TRACKER                 3
103 #define PSNET_TYPE_VALIDATION                           4
104
105 extern net_addr_t Psnet_my_addr;                                                        // address information of this machine
106 extern uint Psnet_my_ip;
107 extern int Psnet_my_addr_valid;
108
109 extern int Network_status;
110 extern int Tcp_failure_code;
111 extern int Ipx_failure_code;
112
113 extern int Tcp_active;
114 extern int Ipx_active;
115
116 extern int Socket_type;                                                                         // protocol type in use (see NET_* defines above)
117
118 // specified their internet connnection type
119 #define NETWORK_CONNECTION_NONE                 1
120 #define NETWORK_CONNECTION_DIALUP               2
121 #define NETWORK_CONNECTION_LAN                  3
122
123 extern int Psnet_connection;
124
125 extern ushort Psnet_default_port;
126
127 // Reliable socket states
128 #define RNF_UNUSED                      0               // Completely clean socket..
129 #define RNF_CONNECTED           1               // Connected and running fine
130 #define RNF_BROKEN                      2               // Broken - disconnected abnormally
131 #define RNF_DISCONNECTED        3               // Disconnected cleanly
132 #define RNF_CONNECTING          4               // We received the connecting message, but haven't told the game yet.
133 #define RNF_LIMBO                               5               // between connecting and connected
134
135 extern SOCKET Unreliable_socket;        // all PXO API modules should use this to send and receive on
136
137 // -------------------------------------------------------------------------------------------------------
138 // PSNET 2 TOP LAYER FUNCTIONS - these functions simply buffer and store packets based upon type (see PSNET_TYPE_* defines)
139 //
140
141 struct sockaddr;
142 struct fd_set;
143 struct timeval;
144
145 // wrappers around select() and recvfrom() for lagging/losing data, and for sorting through different packet types
146 int RECVFROM(uint s, char * buf, int len, int flags, sockaddr *from, int *fromlen, int psnet_type);
147 int SELECT(int nfds, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, const timeval* timeout, int psnet_type);
148
149 // wrappers around sendto to sorting through different packet types
150 int SENDTO(uint s, char * buf, int len, int flags, sockaddr * to, int tolen, int psnet_type);
151
152 // call this once per frame to read everything off of our socket
153 void PSNET_TOP_LAYER_PROCESS();
154
155
156 // -------------------------------------------------------------------------------------------------------
157 // PSNET 2 FUNCTIONS
158 //
159
160 // initialize psnet to use the specified port
161 void psnet_init(int protocol, int default_port);
162
163 // shutdown psnet
164 void psnet_close();
165
166 // set the protocol to use
167 int psnet_use_protocol(int type);
168
169 // get the status of the network
170 int psnet_get_network_status();
171
172 // convert a net_addr to a string
173 char *psnet_addr_to_string( char * text, net_addr_t * address );
174
175 // convert a string to a net addr
176 void psnet_string_to_addr( net_addr_t * address, char * text );
177
178 // compare 2 addresses
179 int psnet_same( net_addr_t * a1, net_addr_t * a2 );
180
181 // send data unreliably
182 int psnet_send( net_addr_t * who_to, void * data, int len, int np_index = -1 );
183
184 // get data from the unreliable socket
185 int psnet_get( void * data, net_addr_t * from_addr );
186
187 // broadcast data on unreliable socket
188 int psnet_broadcast( net_addr_t * who_to, void * data, int len );
189
190 // flush all sockets
191 void psnet_flush();
192
193 // if the passed string is a valid IP string
194 int psnet_is_valid_ip_string( char *ip_string, int allow_port=1 );
195
196 // mark a socket as having received data
197 void psnet_mark_received(PSNET_SOCKET_RELIABLE socket);
198
199
200 // -------------------------------------------------------------------------------------------------------
201 // PSNET 2 RELIABLE SOCKET FUNCTIONS
202 //
203
204 // shutdown a reliable socket
205 void psnet_rel_close_socket(PSNET_SOCKET_RELIABLE *sockp);
206
207 // obsolete function - left in for compatibility sake
208 int psnet_rel_check();
209
210 // send data on the reliable socket
211 int psnet_rel_send(PSNET_SOCKET_RELIABLE socket, ubyte *data, int length, int np_index = -1);
212
213 // Return codes:
214 // -1 socket not connected
215 // 0 No packet ready to receive
216 // >0 Buffer filled with the number of bytes recieved
217 int psnet_rel_get(PSNET_SOCKET_RELIABLE socket, ubyte *buffer, int max_length);
218
219 // process all active reliable sockets
220 void psnet_rel_work();
221
222 // get the status of a reliable socket, see RNF_* defines above
223 int psnet_rel_get_status(PSNET_SOCKET_RELIABLE sock);
224
225 // check the listen socket for pending reliable connections
226 int psnet_rel_check_for_listen(net_addr_t *addr);
227
228 // perform a reliable socket connect to the specified server
229 void psnet_rel_connect_to_server(PSNET_SOCKET_RELIABLE *s, net_addr_t *server_addr);
230
231 #endif
232