00001
00005 #ifndef __ENET_ENET_H__
00006 #define __ENET_ENET_H__
00007
00008 #ifdef __cplusplus
00009 extern "C"
00010 {
00011 #endif
00012
00013 #include <stdlib.h>
00014
00015 #ifdef _WIN32
00016 #include "enet/win32.h"
00017 #else
00018 #include "enet/unix.h"
00019 #endif
00020
00021 #include "enet/types.h"
00022 #include "enet/protocol.h"
00023 #include "enet/list.h"
00024 #include "enet/callbacks.h"
00025
00026 #define ENET_VERSION_MAJOR 1
00027 #define ENET_VERSION_MINOR 3
00028 #define ENET_VERSION_PATCH 11
00029 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))
00030 #define ENET_VERSION_GET_MAJOR(version) (((version)>>16)&0xFF)
00031 #define ENET_VERSION_GET_MINOR(version) (((version)>>8)&0xFF)
00032 #define ENET_VERSION_GET_PATCH(version) ((version)&0xFF)
00033 #define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH)
00034
00035 typedef enet_uint32 ENetVersion;
00036
00037 struct _ENetHost;
00038 struct _ENetEvent;
00039 struct _ENetPacket;
00040
00041 typedef enum _ENetSocketType
00042 {
00043 ENET_SOCKET_TYPE_STREAM = 1,
00044 ENET_SOCKET_TYPE_DATAGRAM = 2
00045 } ENetSocketType;
00046
00047 typedef enum _ENetSocketWait
00048 {
00049 ENET_SOCKET_WAIT_NONE = 0,
00050 ENET_SOCKET_WAIT_SEND = (1 << 0),
00051 ENET_SOCKET_WAIT_RECEIVE = (1 << 1),
00052 ENET_SOCKET_WAIT_INTERRUPT = (1 << 2)
00053 } ENetSocketWait;
00054
00055 typedef enum _ENetSocketOption
00056 {
00057 ENET_SOCKOPT_NONBLOCK = 1,
00058 ENET_SOCKOPT_BROADCAST = 2,
00059 ENET_SOCKOPT_RCVBUF = 3,
00060 ENET_SOCKOPT_SNDBUF = 4,
00061 ENET_SOCKOPT_REUSEADDR = 5,
00062 ENET_SOCKOPT_RCVTIMEO = 6,
00063 ENET_SOCKOPT_SNDTIMEO = 7,
00064 ENET_SOCKOPT_ERROR = 8,
00065 ENET_SOCKOPT_NODELAY = 9
00066 } ENetSocketOption;
00067
00068 typedef enum _ENetSocketShutdown
00069 {
00070 ENET_SOCKET_SHUTDOWN_READ = 0,
00071 ENET_SOCKET_SHUTDOWN_WRITE = 1,
00072 ENET_SOCKET_SHUTDOWN_READ_WRITE = 2
00073 } ENetSocketShutdown;
00074
00075 #define ENET_HOST_ANY 0
00076 #define ENET_HOST_BROADCAST 0xFFFFFFFFU
00077 #define ENET_PORT_ANY 0
00078
00089 typedef struct _ENetAddress
00090 {
00091 enet_uint32 host;
00092 enet_uint16 port;
00093 } ENetAddress;
00094
00104 typedef enum _ENetPacketFlag
00105 {
00108 ENET_PACKET_FLAG_RELIABLE = (1 << 0),
00112 ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1),
00114 ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2),
00117 ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3),
00118
00120 ENET_PACKET_FLAG_SENT = (1<<8)
00121 } ENetPacketFlag;
00122
00123 typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *);
00124
00144 typedef struct _ENetPacket
00145 {
00146 size_t referenceCount;
00147 enet_uint32 flags;
00148 enet_uint8 * data;
00149 size_t dataLength;
00150 ENetPacketFreeCallback freeCallback;
00151 void * userData;
00152 } ENetPacket;
00153
00154 typedef struct _ENetAcknowledgement
00155 {
00156 ENetListNode acknowledgementList;
00157 enet_uint32 sentTime;
00158 ENetProtocol command;
00159 } ENetAcknowledgement;
00160
00161 typedef struct _ENetOutgoingCommand
00162 {
00163 ENetListNode outgoingCommandList;
00164 enet_uint16 reliableSequenceNumber;
00165 enet_uint16 unreliableSequenceNumber;
00166 enet_uint32 sentTime;
00167 enet_uint32 roundTripTimeout;
00168 enet_uint32 roundTripTimeoutLimit;
00169 enet_uint32 fragmentOffset;
00170 enet_uint16 fragmentLength;
00171 enet_uint16 sendAttempts;
00172 ENetProtocol command;
00173 ENetPacket * packet;
00174 } ENetOutgoingCommand;
00175
00176 typedef struct _ENetIncomingCommand
00177 {
00178 ENetListNode incomingCommandList;
00179 enet_uint16 reliableSequenceNumber;
00180 enet_uint16 unreliableSequenceNumber;
00181 ENetProtocol command;
00182 enet_uint32 fragmentCount;
00183 enet_uint32 fragmentsRemaining;
00184 enet_uint32 * fragments;
00185 ENetPacket * packet;
00186 } ENetIncomingCommand;
00187
00188 typedef enum _ENetPeerState
00189 {
00190 ENET_PEER_STATE_DISCONNECTED = 0,
00191 ENET_PEER_STATE_CONNECTING = 1,
00192 ENET_PEER_STATE_ACKNOWLEDGING_CONNECT = 2,
00193 ENET_PEER_STATE_CONNECTION_PENDING = 3,
00194 ENET_PEER_STATE_CONNECTION_SUCCEEDED = 4,
00195 ENET_PEER_STATE_CONNECTED = 5,
00196 ENET_PEER_STATE_DISCONNECT_LATER = 6,
00197 ENET_PEER_STATE_DISCONNECTING = 7,
00198 ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT = 8,
00199 ENET_PEER_STATE_ZOMBIE = 9
00200 } ENetPeerState;
00201
00202 #ifndef ENET_BUFFER_MAXIMUM
00203 #define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS)
00204 #endif
00205
00206 enum
00207 {
00208 ENET_HOST_RECEIVE_BUFFER_SIZE = 256 * 1024,
00209 ENET_HOST_SEND_BUFFER_SIZE = 256 * 1024,
00210 ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL = 1000,
00211 ENET_HOST_DEFAULT_MTU = 1400,
00212
00213 ENET_PEER_DEFAULT_ROUND_TRIP_TIME = 500,
00214 ENET_PEER_DEFAULT_PACKET_THROTTLE = 32,
00215 ENET_PEER_PACKET_THROTTLE_SCALE = 32,
00216 ENET_PEER_PACKET_THROTTLE_COUNTER = 7,
00217 ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2,
00218 ENET_PEER_PACKET_THROTTLE_DECELERATION = 2,
00219 ENET_PEER_PACKET_THROTTLE_INTERVAL = 5000,
00220 ENET_PEER_PACKET_LOSS_SCALE = (1 << 16),
00221 ENET_PEER_PACKET_LOSS_INTERVAL = 10000,
00222 ENET_PEER_WINDOW_SIZE_SCALE = 64 * 1024,
00223 ENET_PEER_TIMEOUT_LIMIT = 32,
00224 ENET_PEER_TIMEOUT_MINIMUM = 5000,
00225 ENET_PEER_TIMEOUT_MAXIMUM = 30000,
00226 ENET_PEER_PING_INTERVAL = 500,
00227 ENET_PEER_UNSEQUENCED_WINDOWS = 64,
00228 ENET_PEER_UNSEQUENCED_WINDOW_SIZE = 1024,
00229 ENET_PEER_FREE_UNSEQUENCED_WINDOWS = 32,
00230 ENET_PEER_RELIABLE_WINDOWS = 16,
00231 ENET_PEER_RELIABLE_WINDOW_SIZE = 0x1000,
00232 ENET_PEER_FREE_RELIABLE_WINDOWS = 8
00233 };
00234
00235 typedef struct _ENetChannel
00236 {
00237 enet_uint16 outgoingReliableSequenceNumber;
00238 enet_uint16 outgoingUnreliableSequenceNumber;
00239 enet_uint16 usedReliableWindows;
00240 enet_uint16 reliableWindows [ENET_PEER_RELIABLE_WINDOWS];
00241 enet_uint16 incomingReliableSequenceNumber;
00242 enet_uint16 incomingUnreliableSequenceNumber;
00243 ENetList incomingReliableCommands;
00244 ENetList incomingUnreliableCommands;
00245 } ENetChannel;
00246
00252 typedef struct _ENetPeer
00253 {
00254 ENetListNode dispatchList;
00255 struct _ENetHost * host;
00256 enet_uint16 outgoingPeerID;
00257 enet_uint16 incomingPeerID;
00258 enet_uint32 connectID;
00259 enet_uint8 outgoingSessionID;
00260 enet_uint8 incomingSessionID;
00261 ENetAddress address;
00262 void * data;
00263 ENetPeerState state;
00264 ENetChannel * channels;
00265 size_t channelCount;
00266 enet_uint32 incomingBandwidth;
00267 enet_uint32 outgoingBandwidth;
00268 enet_uint32 incomingBandwidthThrottleEpoch;
00269 enet_uint32 outgoingBandwidthThrottleEpoch;
00270 enet_uint32 incomingDataTotal;
00271 enet_uint32 outgoingDataTotal;
00272 enet_uint32 lastSendTime;
00273 enet_uint32 lastReceiveTime;
00274 enet_uint32 nextTimeout;
00275 enet_uint32 earliestTimeout;
00276 enet_uint32 packetLossEpoch;
00277 enet_uint32 packetsSent;
00278 enet_uint32 packetsLost;
00279 enet_uint32 packetLoss;
00280 enet_uint32 packetLossVariance;
00281 enet_uint32 packetThrottle;
00282 enet_uint32 packetThrottleLimit;
00283 enet_uint32 packetThrottleCounter;
00284 enet_uint32 packetThrottleEpoch;
00285 enet_uint32 packetThrottleAcceleration;
00286 enet_uint32 packetThrottleDeceleration;
00287 enet_uint32 packetThrottleInterval;
00288 enet_uint32 pingInterval;
00289 enet_uint32 timeoutLimit;
00290 enet_uint32 timeoutMinimum;
00291 enet_uint32 timeoutMaximum;
00292 enet_uint32 lastRoundTripTime;
00293 enet_uint32 lowestRoundTripTime;
00294 enet_uint32 lastRoundTripTimeVariance;
00295 enet_uint32 highestRoundTripTimeVariance;
00296 enet_uint32 roundTripTime;
00297 enet_uint32 roundTripTimeVariance;
00298 enet_uint32 mtu;
00299 enet_uint32 windowSize;
00300 enet_uint32 reliableDataInTransit;
00301 enet_uint16 outgoingReliableSequenceNumber;
00302 ENetList acknowledgements;
00303 ENetList sentReliableCommands;
00304 ENetList sentUnreliableCommands;
00305 ENetList outgoingReliableCommands;
00306 ENetList outgoingUnreliableCommands;
00307 ENetList dispatchedCommands;
00308 int needsDispatch;
00309 enet_uint16 incomingUnsequencedGroup;
00310 enet_uint16 outgoingUnsequencedGroup;
00311 enet_uint32 unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32];
00312 enet_uint32 eventData;
00313 } ENetPeer;
00314
00317 typedef struct _ENetCompressor
00318 {
00320 void * context;
00322 size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit);
00324 size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit);
00326 void (ENET_CALLBACK * destroy) (void * context);
00327 } ENetCompressor;
00328
00330 typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount);
00331
00333 typedef int (ENET_CALLBACK * ENetInterceptCallback) (struct _ENetHost * host, struct _ENetEvent * event);
00334
00351 typedef struct _ENetHost
00352 {
00353 ENetSocket socket;
00354 ENetAddress address;
00355 enet_uint32 incomingBandwidth;
00356 enet_uint32 outgoingBandwidth;
00357 enet_uint32 bandwidthThrottleEpoch;
00358 enet_uint32 mtu;
00359 enet_uint32 randomSeed;
00360 int recalculateBandwidthLimits;
00361 ENetPeer * peers;
00362 size_t peerCount;
00363 size_t channelLimit;
00364 enet_uint32 serviceTime;
00365 ENetList dispatchQueue;
00366 int continueSending;
00367 size_t packetSize;
00368 enet_uint16 headerFlags;
00369 ENetProtocol commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS];
00370 size_t commandCount;
00371 ENetBuffer buffers [ENET_BUFFER_MAXIMUM];
00372 size_t bufferCount;
00373 ENetChecksumCallback checksum;
00374 ENetCompressor compressor;
00375 enet_uint8 packetData [2][ENET_PROTOCOL_MAXIMUM_MTU];
00376 ENetAddress receivedAddress;
00377 enet_uint8 * receivedData;
00378 size_t receivedDataLength;
00379 enet_uint32 totalSentData;
00380 enet_uint32 totalSentPackets;
00381 enet_uint32 totalReceivedData;
00382 enet_uint32 totalReceivedPackets;
00383 ENetInterceptCallback intercept;
00384 size_t connectedPeers;
00385 size_t bandwidthLimitedPeers;
00386 size_t duplicatePeers;
00387 } ENetHost;
00388
00392 typedef enum _ENetEventType
00393 {
00395 ENET_EVENT_TYPE_NONE = 0,
00396
00400 ENET_EVENT_TYPE_CONNECT = 1,
00401
00409 ENET_EVENT_TYPE_DISCONNECT = 2,
00410
00417 ENET_EVENT_TYPE_RECEIVE = 3
00418 } ENetEventType;
00419
00425 typedef struct _ENetEvent
00426 {
00427 ENetEventType type;
00428 ENetPeer * peer;
00429 enet_uint8 channelID;
00430 enet_uint32 data;
00431 ENetPacket * packet;
00432 } ENetEvent;
00433
00443 ENET_API int enet_initialize (void);
00444
00452 ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits);
00453
00458 ENET_API void enet_deinitialize (void);
00459
00464 ENET_API ENetVersion enet_linked_version (void);
00465
00474 ENET_API enet_uint32 enet_time_get (void);
00478 ENET_API void enet_time_set (enet_uint32);
00479
00483 ENET_API ENetSocket enet_socket_create (ENetSocketType);
00484 ENET_API int enet_socket_bind (ENetSocket, const ENetAddress *);
00485 ENET_API int enet_socket_get_address (ENetSocket, ENetAddress *);
00486 ENET_API int enet_socket_listen (ENetSocket, int);
00487 ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
00488 ENET_API int enet_socket_connect (ENetSocket, const ENetAddress *);
00489 ENET_API int enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
00490 ENET_API int enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
00491 ENET_API int enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
00492 ENET_API int enet_socket_set_option (ENetSocket, ENetSocketOption, int);
00493 ENET_API int enet_socket_get_option (ENetSocket, ENetSocketOption, int *);
00494 ENET_API int enet_socket_shutdown (ENetSocket, ENetSocketShutdown);
00495 ENET_API void enet_socket_destroy (ENetSocket);
00496 ENET_API int enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);
00497
00511 ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName);
00512
00521 ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength);
00522
00531 ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);
00532
00535 ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);
00536 ENET_API void enet_packet_destroy (ENetPacket *);
00537 ENET_API int enet_packet_resize (ENetPacket *, size_t);
00538 ENET_API enet_uint32 enet_crc32 (const ENetBuffer *, size_t);
00539
00540 ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32);
00541 ENET_API void enet_host_destroy (ENetHost *);
00542 ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32);
00543 ENET_API int enet_host_check_events (ENetHost *, ENetEvent *);
00544 ENET_API int enet_host_service (ENetHost *, ENetEvent *, enet_uint32);
00545 ENET_API void enet_host_flush (ENetHost *);
00546 ENET_API void enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *);
00547 ENET_API void enet_host_compress (ENetHost *, const ENetCompressor *);
00548 ENET_API int enet_host_compress_with_range_coder (ENetHost * host);
00549 ENET_API void enet_host_channel_limit (ENetHost *, size_t);
00550 ENET_API void enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32);
00551 extern void enet_host_bandwidth_throttle (ENetHost *);
00552 extern enet_uint32 enet_host_random_seed (void);
00553
00554 ENET_API int enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);
00555 ENET_API ENetPacket * enet_peer_receive (ENetPeer *, enet_uint8 * channelID);
00556 ENET_API void enet_peer_ping (ENetPeer *);
00557 ENET_API void enet_peer_ping_interval (ENetPeer *, enet_uint32);
00558 ENET_API void enet_peer_timeout (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);
00559 ENET_API void enet_peer_reset (ENetPeer *);
00560 ENET_API void enet_peer_disconnect (ENetPeer *, enet_uint32);
00561 ENET_API void enet_peer_disconnect_now (ENetPeer *, enet_uint32);
00562 ENET_API void enet_peer_disconnect_later (ENetPeer *, enet_uint32);
00563 ENET_API void enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);
00564 extern int enet_peer_throttle (ENetPeer *, enet_uint32);
00565 extern void enet_peer_reset_queues (ENetPeer *);
00566 extern void enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *);
00567 extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16);
00568 extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32);
00569 extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16);
00570 extern void enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *);
00571 extern void enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *);
00572 extern void enet_peer_on_connect (ENetPeer *);
00573 extern void enet_peer_on_disconnect (ENetPeer *);
00574
00575 ENET_API void * enet_range_coder_create (void);
00576 ENET_API void enet_range_coder_destroy (void *);
00577 ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t);
00578 ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t);
00579
00580 extern size_t enet_protocol_command_size (enet_uint8);
00581
00582 #ifdef __cplusplus
00583 }
00584 #endif
00585
00586 #endif
00587