2 * Copyright (C) Volition, Inc. 1999. All rights reserved.
4 * All source code herein is the property of Volition, Inc. You may not sell
5 * or otherwise commercially exploit the source or things you created based on
10 * $Logfile: /Freespace2/code/Network/Psnet2.h $
15 * Header file for the application level network-interface.
18 * Revision 1.7 2005/10/01 21:38:32 taylor
19 * some reorg of includes to not requires the same headers in many different files
20 * handle FS1 specific language changes
21 * some OS X changes for paths and to handle socklen_t better
23 * Revision 1.6 2002/06/16 05:20:01 relnev
24 * work around some gcc 3.1 weirdness
26 * Revision 1.5 2002/06/09 04:41:14 relnev
27 * added copyright header
29 * Revision 1.4 2002/05/27 00:40:47 theoddone33
30 * Fix net_addr vs net_addr_t
32 * Revision 1.3 2002/05/26 21:27:53 theoddone33
33 * More progress (I hate psnet2)
35 * Revision 1.2 2002/05/26 20:22:48 theoddone33
36 * Most of network/ works
38 * Revision 1.1.1.1 2002/05/03 03:28:12 root
42 * 9 8/16/99 4:06p Dave
43 * Big honking checkin.
45 * 8 7/28/99 11:46a Dave
46 * Put in FS2_DEMO defines for port stuff.
48 * 7 6/25/99 11:59a Dave
49 * Multi options screen.
51 * 6 6/07/99 9:51p Dave
52 * Consolidated all multiplayer ports into one.
54 * 5 3/09/99 6:24p Dave
55 * More work on object update revamping. Identified several sources of
56 * unnecessary bandwidth.
58 * 4 11/19/98 4:19p Dave
59 * Put IPX sockets back in psnet. Consolidated all multiplayer config
62 * 3 11/19/98 8:04a Dave
63 * Full support for D3-style reliable sockets. Revamped packet lag/loss
64 * system, made it receiver side and at the lowest possible level.
75 #include <sys/select.h>
77 #include <sys/types.h>
78 #include <sys/socket.h>
84 #if defined(__APPLE__) && !defined(_SOCKLEN_T)
85 typedef int socklen_t;
88 // -------------------------------------------------------------------------------------------------------
89 // PSNET 2 DEFINES/VARS
92 #define NET_NONE 0 // if no protocol is active or none are selected
97 #define MAX_PACKET_SIZE 512
100 #define DEFAULT_GAME_PORT 7802
102 #define DEFAULT_GAME_PORT 7808
105 typedef struct net_addr {
106 uint type; // See NET_ defines above
107 ubyte net_id[4]; // used for IPX only
108 ubyte addr[6]; // address (first 4 used when IP, all 6 used when IPX)
112 // define these in such a manner that a call to psnet_send_reliable is exactly the same and the new code in unobtrusive
113 typedef uint PSNET_SOCKET;
114 typedef uint PSNET_SOCKET_RELIABLE;
115 #undef INVALID_SOCKET
116 #define INVALID_SOCKET (PSNET_SOCKET)(~0)
118 // defines for protocol overheads
119 #define UDP_HEADER_SIZE 34
120 #define TCP_HEADER_SIZE 40
121 #define TCP_HEADER_SIZE_COMPRESSED 6
123 // define values for network errors when trying to enter the ready room
124 #define NETWORK_ERROR_NONE 0
125 #define NETWORK_ERROR_NO_TYPE -1
126 #define NETWORK_ERROR_NO_WINSOCK -2
127 #define NETWORK_ERROR_NO_PROTOCOL -3
128 #define NETWORK_ERROR_RELIABLE -4
129 #define NETWORK_ERROR_CONNECT_TO_ISP -5
130 #define NETWORK_ERROR_LAN_AND_RAS -6
132 // psnet packet types
133 #define PSNET_NUM_TYPES 5
134 #define PSNET_TYPE_UNRELIABLE 0
135 #define PSNET_TYPE_RELIABLE 1
136 #define PSNET_TYPE_USER_TRACKER 2
137 #define PSNET_TYPE_GAME_TRACKER 3
138 #define PSNET_TYPE_VALIDATION 4
140 extern net_addr_t Psnet_my_addr; // address information of this machine
141 extern uint Psnet_my_ip;
142 extern int Psnet_my_addr_valid;
144 extern int Network_status;
145 extern int Tcp_failure_code;
146 extern int Ipx_failure_code;
148 extern int Tcp_active;
149 extern int Ipx_active;
151 extern int Socket_type; // protocol type in use (see NET_* defines above)
153 // specified their internet connnection type
154 #define NETWORK_CONNECTION_NONE 1
155 #define NETWORK_CONNECTION_DIALUP 2
156 #define NETWORK_CONNECTION_LAN 3
158 extern int Psnet_connection;
160 extern ushort Psnet_default_port;
162 // Reliable socket states
163 #define RNF_UNUSED 0 // Completely clean socket..
164 #define RNF_CONNECTED 1 // Connected and running fine
165 #define RNF_BROKEN 2 // Broken - disconnected abnormally
166 #define RNF_DISCONNECTED 3 // Disconnected cleanly
167 #define RNF_CONNECTING 4 // We received the connecting message, but haven't told the game yet.
168 #define RNF_LIMBO 5 // between connecting and connected
170 extern SOCKET Unreliable_socket; // all PXO API modules should use this to send and receive on
172 // -------------------------------------------------------------------------------------------------------
173 // PSNET 2 TOP LAYER FUNCTIONS - these functions simply buffer and store packets based upon type (see PSNET_TYPE_* defines)
182 // wrappers around select() and recvfrom() for lagging/losing data, and for sorting through different packet types
183 int RECVFROM(uint s, char * buf, int len, int flags, sockaddr *from, int *fromlen, int psnet_type);
184 int SELECT(int nfds, fd_set *readfds, fd_set *writefds, fd_set*exceptfds, const timeval* timeout, int psnet_type);
186 // wrappers around sendto to sorting through different packet types
187 int SENDTO(uint s, char * buf, int len, int flags, sockaddr * to, int tolen, int psnet_type);
189 // call this once per frame to read everything off of our socket
190 void PSNET_TOP_LAYER_PROCESS();
193 // -------------------------------------------------------------------------------------------------------
197 // initialize psnet to use the specified port
198 void psnet_init(int protocol, int default_port);
203 // set the protocol to use
204 int psnet_use_protocol(int type);
206 // get the status of the network
207 int psnet_get_network_status();
209 // convert a net_addr to a string
210 char *psnet_addr_to_string( char * text, net_addr_t * address );
212 // convert a string to a net addr
213 void psnet_string_to_addr( net_addr_t * address, char * text );
215 // compare 2 addresses
216 int psnet_same( net_addr_t * a1, net_addr_t * a2 );
218 // send data unreliably
219 int psnet_send( net_addr_t * who_to, void * data, int len, int np_index = -1 );
221 // get data from the unreliable socket
222 int psnet_get( void * data, net_addr_t * from_addr );
224 // broadcast data on unreliable socket
225 int psnet_broadcast( net_addr_t * who_to, void * data, int len );
230 // if the passed string is a valid IP string
231 int psnet_is_valid_ip_string( char *ip_string, int allow_port=1 );
233 // mark a socket as having received data
234 void psnet_mark_received(PSNET_SOCKET_RELIABLE socket);
237 // -------------------------------------------------------------------------------------------------------
238 // PSNET 2 RELIABLE SOCKET FUNCTIONS
241 // shutdown a reliable socket
242 void psnet_rel_close_socket(PSNET_SOCKET_RELIABLE *sockp);
244 // obsolete function - left in for compatibility sake
245 int psnet_rel_check();
247 // send data on the reliable socket
248 int psnet_rel_send(PSNET_SOCKET_RELIABLE socket, ubyte *data, int length, int np_index = -1);
251 // -1 socket not connected
252 // 0 No packet ready to receive
253 // >0 Buffer filled with the number of bytes recieved
254 int psnet_rel_get(PSNET_SOCKET_RELIABLE socket, ubyte *buffer, int max_length);
256 // process all active reliable sockets
257 void psnet_rel_work();
259 // get the status of a reliable socket, see RNF_* defines above
260 int psnet_rel_get_status(PSNET_SOCKET_RELIABLE sock);
262 // check the listen socket for pending reliable connections
263 int psnet_rel_check_for_listen(net_addr_t *addr);
265 // perform a reliable socket connect to the specified server
266 void psnet_rel_connect_to_server(PSNET_SOCKET_RELIABLE *s, net_addr_t *server_addr);