enet
enet.h
Go to the documentation of this file.
1 
5 #ifndef __ENET_ENET_H__
6 #define __ENET_ENET_H__
7 
8 #ifdef __cplusplus
9 extern "C"
10 {
11 #endif
12 
13 #include <stdlib.h>
14 
15 #ifdef WIN32
16 #include "enet/win32.h"
17 #else
18 #include "enet/unix.h"
19 #endif
20 
21 #include "enet/types.h"
22 #include "enet/protocol.h"
23 #include "enet/list.h"
24 #include "enet/callbacks.h"
25 
26 #define ENET_VERSION_MAJOR 1
27 #define ENET_VERSION_MINOR 3
28 #define ENET_VERSION_PATCH 5
29 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))
30 #define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH)
31 
32 typedef enet_uint32 ENetVersion;
33 
34 typedef enum _ENetSocketType
35 {
36  ENET_SOCKET_TYPE_STREAM = 1,
37  ENET_SOCKET_TYPE_DATAGRAM = 2
38 } ENetSocketType;
39 
40 typedef enum _ENetSocketWait
41 {
42  ENET_SOCKET_WAIT_NONE = 0,
43  ENET_SOCKET_WAIT_SEND = (1 << 0),
44  ENET_SOCKET_WAIT_RECEIVE = (1 << 1)
45 } ENetSocketWait;
46 
47 typedef enum _ENetSocketOption
48 {
49  ENET_SOCKOPT_NONBLOCK = 1,
50  ENET_SOCKOPT_BROADCAST = 2,
51  ENET_SOCKOPT_RCVBUF = 3,
52  ENET_SOCKOPT_SNDBUF = 4,
53  ENET_SOCKOPT_REUSEADDR = 5,
54  ENET_SOCKOPT_RCVTIMEO = 6,
55  ENET_SOCKOPT_SNDTIMEO = 7
56 } ENetSocketOption;
57 
58 enum
59 {
61  ENET_HOST_BROADCAST = 0xFFFFFFFF,
64 };
65 
76 typedef struct _ENetAddress
77 {
78  enet_uint32 host;
79  enet_uint16 port;
80 } ENetAddress;
81 
91 typedef enum _ENetPacketFlag
92 {
106 
107 struct _ENetPacket;
108 typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *);
109 
129 typedef struct _ENetPacket
130 {
131  size_t referenceCount;
134  size_t dataLength;
135  ENetPacketFreeCallback freeCallback;
136 } ENetPacket;
137 
138 typedef struct _ENetAcknowledgement
139 {
140  ENetListNode acknowledgementList;
141  enet_uint32 sentTime;
142  ENetProtocol command;
144 
145 typedef struct _ENetOutgoingCommand
146 {
147  ENetListNode outgoingCommandList;
148  enet_uint16 reliableSequenceNumber;
149  enet_uint16 unreliableSequenceNumber;
150  enet_uint32 sentTime;
151  enet_uint32 roundTripTimeout;
152  enet_uint32 roundTripTimeoutLimit;
153  enet_uint32 fragmentOffset;
154  enet_uint16 fragmentLength;
155  enet_uint16 sendAttempts;
156  ENetProtocol command;
157  ENetPacket * packet;
159 
160 typedef struct _ENetIncomingCommand
161 {
162  ENetListNode incomingCommandList;
163  enet_uint16 reliableSequenceNumber;
164  enet_uint16 unreliableSequenceNumber;
165  ENetProtocol command;
166  enet_uint32 fragmentCount;
167  enet_uint32 fragmentsRemaining;
168  enet_uint32 * fragments;
169  ENetPacket * packet;
171 
172 typedef enum _ENetPeerState
173 {
174  ENET_PEER_STATE_DISCONNECTED = 0,
175  ENET_PEER_STATE_CONNECTING = 1,
176  ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2,
177  ENET_PEER_STATE_CONNECTION_PENDING = 3,
178  ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4,
179  ENET_PEER_STATE_CONNECTED = 5,
180  ENET_PEER_STATE_DISCONNECT_LATER = 6,
181  ENET_PEER_STATE_DISCONNECTING = 7,
182  ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8,
183  ENET_PEER_STATE_ZOMBIE = 9
184 } ENetPeerState;
185 
186 #ifndef ENET_BUFFER_MAXIMUM
187 #define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS)
188 #endif
189 
190 enum
191 {
192  ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024,
193  ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024,
194  ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000,
195  ENET_HOST_DEFAULT_MTU = 1400,
196 
197  ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500,
198  ENET_PEER_DEFAULT_PACKET_THROTTLE = 32,
199  ENET_PEER_PACKET_THROTTLE_SCALE = 32,
200  ENET_PEER_PACKET_THROTTLE_COUNTER = 7,
201  ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2,
202  ENET_PEER_PACKET_THROTTLE_DECELERATION = 2,
203  ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000,
204  ENET_PEER_PACKET_LOSS_SCALE = (1 << 16),
205  ENET_PEER_PACKET_LOSS_INTERVAL = 10000,
206  ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024,
207  ENET_PEER_TIMEOUT_LIMIT = 32,
208  ENET_PEER_TIMEOUT_MINIMUM = 5000,
209  ENET_PEER_TIMEOUT_MAXIMUM = 30000,
210  ENET_PEER_PING_INTERVAL = 500,
211  ENET_PEER_UNSEQUENCED_WINDOWS = 64,
212  ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024,
213  ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32,
214  ENET_PEER_RELIABLE_WINDOWS = 16,
215  ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000,
216  ENET_PEER_FREE_RELIABLE_WINDOWS = 8
217 };
218 
219 typedef struct _ENetChannel
220 {
221  enet_uint16 outgoingReliableSequenceNumber;
222  enet_uint16 outgoingUnreliableSequenceNumber;
223  enet_uint16 usedReliableWindows;
224  enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS];
225  enet_uint16 incomingReliableSequenceNumber;
226  enet_uint16 incomingUnreliableSequenceNumber;
227  ENetList incomingReliableCommands;
228  ENetList incomingUnreliableCommands;
229 } ENetChannel;
230 
236 typedef struct _ENetPeer
237 {
238  ENetListNode dispatchList;
239  struct _ENetHost * host;
240  enet_uint16 outgoingPeerID;
241  enet_uint16 incomingPeerID;
242  enet_uint32 connectID;
243  enet_uint8 outgoingSessionID;
244  enet_uint8 incomingSessionID;
246  void * data;
247  ENetPeerState state;
248  ENetChannel * channels;
249  size_t channelCount;
252  enet_uint32 incomingBandwidthThrottleEpoch;
253  enet_uint32 outgoingBandwidthThrottleEpoch;
254  enet_uint32 incomingDataTotal;
255  enet_uint32 outgoingDataTotal;
256  enet_uint32 lastSendTime;
257  enet_uint32 lastReceiveTime;
258  enet_uint32 nextTimeout;
259  enet_uint32 earliestTimeout;
260  enet_uint32 packetLossEpoch;
261  enet_uint32 packetsSent;
262  enet_uint32 packetsLost;
264  enet_uint32 packetLossVariance;
265  enet_uint32 packetThrottle;
266  enet_uint32 packetThrottleLimit;
267  enet_uint32 packetThrottleCounter;
268  enet_uint32 packetThrottleEpoch;
269  enet_uint32 packetThrottleAcceleration;
270  enet_uint32 packetThrottleDeceleration;
271  enet_uint32 packetThrottleInterval;
272  enet_uint32 pingInterval;
273  enet_uint32 timeoutLimit;
274  enet_uint32 timeoutMinimum;
275  enet_uint32 timeoutMaximum;
276  enet_uint32 lastRoundTripTime;
277  enet_uint32 lowestRoundTripTime;
278  enet_uint32 lastRoundTripTimeVariance;
279  enet_uint32 highestRoundTripTimeVariance;
281  enet_uint32 roundTripTimeVariance;
282  enet_uint32 mtu;
283  enet_uint32 windowSize;
284  enet_uint32 reliableDataInTransit;
285  enet_uint16 outgoingReliableSequenceNumber;
286  ENetList acknowledgements;
287  ENetList sentReliableCommands;
288  ENetList sentUnreliableCommands;
289  ENetList outgoingReliableCommands;
290  ENetList outgoingUnreliableCommands;
291  ENetList dispatchedCommands;
292  int needsDispatch;
293  enet_uint16 incomingUnsequencedGroup;
294  enet_uint16 outgoingUnsequencedGroup;
295  enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32];
296  enet_uint32 eventData;
297 } ENetPeer;
298 
301 typedef struct _ENetCompressor
302 {
304  void * context;
306  size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit);
308  size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit);
310  void (ENET_CALLBACK * destroy) (void * context);
312 
314 typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount);
315 
332 typedef struct _ENetHost
333 {
334  ENetSocket socket;
338  enet_uint32 bandwidthThrottleEpoch;
339  enet_uint32 mtu;
340  enet_uint32 randomSeed;
341  int recalculateBandwidthLimits;
343  size_t peerCount;
344  size_t channelLimit;
345  enet_uint32 serviceTime;
346  ENetList dispatchQueue;
347  int continueSending;
348  size_t packetSize;
349  enet_uint16 headerFlags;
350  ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS];
351  size_t commandCount;
352  ENetBuffer buffers [ENET_BUFFER_MAXIMUM];
353  size_t bufferCount;
354  ENetChecksumCallback checksum;
355  ENetCompressor compressor;
356  enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU];
357  ENetAddress receivedAddress;
358  enet_uint8 * receivedData;
359  size_t receivedDataLength;
364 } ENetHost;
365 
369 typedef enum _ENetEventType
370 {
373 
378 
387 
395 } ENetEventType;
396 
402 typedef struct _ENetEvent
403 {
409 } ENetEvent;
410 
420 ENET_API int enet_initialize (void);
421 
429 ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits);
430 
435 ENET_API void enet_deinitialize (void);
436 
445 ENET_API enet_uint32 enet_time_get (void);
449 ENET_API void enet_time_set (enet_uint32);
450 
454 ENET_API ENetSocket enet_socket_create (ENetSocketType);
455 ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *);
456 ENET_API int enet_socket_listen (ENetSocket, int);
457 ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
458 ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *);
459 ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
460 ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
461 ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
462 ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int);
463 ENET_API void enet_socket_destroy (ENetSocket);
464 ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);
465 
479 ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName);
480 
489 ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength);
490 
499 ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);
500 
503 ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);
504 ENET_API void enet_packet_destroy (ENetPacket *);
505 ENET_API int enet_packet_resize (ENetPacket *, size_t);
506 ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t);
507 
508 ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32);
509 ENET_API void enet_host_destroy (ENetHost *);
510 ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32);
511 ENET_API int enet_host_check_events (ENetHost *, ENetEvent *);
512 ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32);
513 ENET_API void enet_host_flush (ENetHost *);
514 ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *);
515 ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *);
516 ENET_API int enet_host_compress_with_range_coder (ENetHost * host);
517 ENET_API void enet_host_channel_limit (ENetHost *, size_t);
519 extern void enet_host_bandwidth_throttle (ENetHost *);
520 
521 ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);
522 ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID);
523 ENET_API void enet_peer_ping (ENetPeer *);
524 ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32);
526 ENET_API void enet_peer_reset (ENetPeer *);
527 ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32);
531 extern int enet_peer_throttle (ENetPeer *, enet_uint32);
532 extern void enet_peer_reset_queues (ENetPeer *);
533 extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *);
534 extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16);
535 extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32);
536 extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16);
537 extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *);
538 extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *);
539 
540 ENET_API void * enet_range_coder_create (void);
541 ENET_API void enet_range_coder_destroy (void *);
542 ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t);
543 ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t);
544 
545 extern size_t enet_protocol_command_size (enet_uint8);
546 
547 #ifdef __cplusplus
548 }
549 #endif
550 
551 #endif /* __ENET_ENET_H__ */
552