enet
enet.h
Go to the documentation of this file.
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 3
00029 #define ENET_VERSION_CREATE(major, minor, patch) (((major)<<16) | ((minor)<<8) | (patch))
00030 #define ENET_VERSION ENET_VERSION_CREATE(ENET_VERSION_MAJOR, ENET_VERSION_MINOR, ENET_VERSION_PATCH)
00031 
00032 typedef enet_uint32 ENetVersion;
00033 
00034 typedef enum _ENetSocketType
00035 {
00036    ENET_SOCKET_TYPE_STREAM   = 1,
00037    ENET_SOCKET_TYPE_DATAGRAM = 2
00038 } ENetSocketType;
00039 
00040 typedef enum _ENetSocketWait
00041 {
00042    ENET_SOCKET_WAIT_NONE    = 0,
00043    ENET_SOCKET_WAIT_SEND    = (1 << 0),
00044    ENET_SOCKET_WAIT_RECEIVE = (1 << 1)
00045 } ENetSocketWait;
00046 
00047 typedef enum _ENetSocketOption
00048 {
00049    ENET_SOCKOPT_NONBLOCK  = 1,
00050    ENET_SOCKOPT_BROADCAST = 2,
00051    ENET_SOCKOPT_RCVBUF    = 3,
00052    ENET_SOCKOPT_SNDBUF    = 4,
00053    ENET_SOCKOPT_REUSEADDR = 5
00054 } ENetSocketOption;
00055 
00056 enum
00057 {
00058    ENET_HOST_ANY       = 0,            
00059    ENET_HOST_BROADCAST = 0xFFFFFFFF,   
00061    ENET_PORT_ANY       = 0             
00062 };
00063 
00074 typedef struct _ENetAddress
00075 {
00076    enet_uint32 host;
00077    enet_uint16 port;
00078 } ENetAddress;
00079 
00089 typedef enum _ENetPacketFlag
00090 {
00093    ENET_PACKET_FLAG_RELIABLE    = (1 << 0),
00097    ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1),
00099    ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2),
00102    ENET_PACKET_FLAG_UNRELIABLE_FRAGMENT = (1 << 3)
00103 } ENetPacketFlag;
00104 
00105 struct _ENetPacket;
00106 typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *);
00107 
00127 typedef struct _ENetPacket
00128 {
00129    size_t                   referenceCount;  
00130    enet_uint32              flags;           
00131    enet_uint8 *             data;            
00132    size_t                   dataLength;      
00133    ENetPacketFreeCallback   freeCallback;    
00134 } ENetPacket;
00135 
00136 typedef struct _ENetAcknowledgement
00137 {
00138    ENetListNode acknowledgementList;
00139    enet_uint32  sentTime;
00140    ENetProtocol command;
00141 } ENetAcknowledgement;
00142 
00143 typedef struct _ENetOutgoingCommand
00144 {
00145    ENetListNode outgoingCommandList;
00146    enet_uint16  reliableSequenceNumber;
00147    enet_uint16  unreliableSequenceNumber;
00148    enet_uint32  sentTime;
00149    enet_uint32  roundTripTimeout;
00150    enet_uint32  roundTripTimeoutLimit;
00151    enet_uint32  fragmentOffset;
00152    enet_uint16  fragmentLength;
00153    enet_uint16  sendAttempts;
00154    ENetProtocol command;
00155    ENetPacket * packet;
00156 } ENetOutgoingCommand;
00157 
00158 typedef struct _ENetIncomingCommand
00159 {  
00160    ENetListNode     incomingCommandList;
00161    enet_uint16      reliableSequenceNumber;
00162    enet_uint16      unreliableSequenceNumber;
00163    ENetProtocol     command;
00164    enet_uint32      fragmentCount;
00165    enet_uint32      fragmentsRemaining;
00166    enet_uint32 *    fragments;
00167    ENetPacket *     packet;
00168 } ENetIncomingCommand;
00169 
00170 typedef enum _ENetPeerState
00171 {
00172    ENET_PEER_STATE_DISCONNECTED                = 0,
00173    ENET_PEER_STATE_CONNECTING                  = 1,
00174    ENET_PEER_STATE_ACKNOWLEDGING_CONNECT       = 2,
00175    ENET_PEER_STATE_CONNECTION_PENDING          = 3,
00176    ENET_PEER_STATE_CONNECTION_SUCCEEDED        = 4,
00177    ENET_PEER_STATE_CONNECTED                   = 5,
00178    ENET_PEER_STATE_DISCONNECT_LATER            = 6,
00179    ENET_PEER_STATE_DISCONNECTING               = 7,
00180    ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT    = 8,
00181    ENET_PEER_STATE_ZOMBIE                      = 9 
00182 } ENetPeerState;
00183 
00184 #ifndef ENET_BUFFER_MAXIMUM
00185 #define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS)
00186 #endif
00187 
00188 enum
00189 {
00190    ENET_HOST_RECEIVE_BUFFER_SIZE          = 256 * 1024,
00191    ENET_HOST_SEND_BUFFER_SIZE             = 256 * 1024,
00192    ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL  = 1000,
00193    ENET_HOST_DEFAULT_MTU                  = 1400,
00194 
00195    ENET_PEER_DEFAULT_ROUND_TRIP_TIME      = 500,
00196    ENET_PEER_DEFAULT_PACKET_THROTTLE      = 32,
00197    ENET_PEER_PACKET_THROTTLE_SCALE        = 32,
00198    ENET_PEER_PACKET_THROTTLE_COUNTER      = 7, 
00199    ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2,
00200    ENET_PEER_PACKET_THROTTLE_DECELERATION = 2,
00201    ENET_PEER_PACKET_THROTTLE_INTERVAL     = 5000,
00202    ENET_PEER_PACKET_LOSS_SCALE            = (1 << 16),
00203    ENET_PEER_PACKET_LOSS_INTERVAL         = 10000,
00204    ENET_PEER_WINDOW_SIZE_SCALE            = 64 * 1024,
00205    ENET_PEER_TIMEOUT_LIMIT                = 32,
00206    ENET_PEER_TIMEOUT_MINIMUM              = 5000,
00207    ENET_PEER_TIMEOUT_MAXIMUM              = 30000,
00208    ENET_PEER_PING_INTERVAL                = 500,
00209    ENET_PEER_UNSEQUENCED_WINDOWS          = 64,
00210    ENET_PEER_UNSEQUENCED_WINDOW_SIZE      = 1024,
00211    ENET_PEER_FREE_UNSEQUENCED_WINDOWS     = 32,
00212    ENET_PEER_RELIABLE_WINDOWS             = 16,
00213    ENET_PEER_RELIABLE_WINDOW_SIZE         = 0x1000,
00214    ENET_PEER_FREE_RELIABLE_WINDOWS        = 8
00215 };
00216 
00217 typedef struct _ENetChannel
00218 {
00219    enet_uint16  outgoingReliableSequenceNumber;
00220    enet_uint16  outgoingUnreliableSequenceNumber;
00221    enet_uint16  usedReliableWindows;
00222    enet_uint16  reliableWindows [ENET_PEER_RELIABLE_WINDOWS];
00223    enet_uint16  incomingReliableSequenceNumber;
00224    enet_uint16  incomingUnreliableSequenceNumber;
00225    ENetList     incomingReliableCommands;
00226    ENetList     incomingUnreliableCommands;
00227 } ENetChannel;
00228 
00234 typedef struct _ENetPeer
00235 { 
00236    ENetListNode  dispatchList;
00237    struct _ENetHost * host;
00238    enet_uint16   outgoingPeerID;
00239    enet_uint16   incomingPeerID;
00240    enet_uint32   connectID;
00241    enet_uint8    outgoingSessionID;
00242    enet_uint8    incomingSessionID;
00243    ENetAddress   address;            
00244    void *        data;               
00245    ENetPeerState state;
00246    ENetChannel * channels;
00247    size_t        channelCount;       
00248    enet_uint32   incomingBandwidth;  
00249    enet_uint32   outgoingBandwidth;  
00250    enet_uint32   incomingBandwidthThrottleEpoch;
00251    enet_uint32   outgoingBandwidthThrottleEpoch;
00252    enet_uint32   incomingDataTotal;
00253    enet_uint32   outgoingDataTotal;
00254    enet_uint32   lastSendTime;
00255    enet_uint32   lastReceiveTime;
00256    enet_uint32   nextTimeout;
00257    enet_uint32   earliestTimeout;
00258    enet_uint32   packetLossEpoch;
00259    enet_uint32   packetsSent;
00260    enet_uint32   packetsLost;
00261    enet_uint32   packetLoss;          
00262    enet_uint32   packetLossVariance;
00263    enet_uint32   packetThrottle;
00264    enet_uint32   packetThrottleLimit;
00265    enet_uint32   packetThrottleCounter;
00266    enet_uint32   packetThrottleEpoch;
00267    enet_uint32   packetThrottleAcceleration;
00268    enet_uint32   packetThrottleDeceleration;
00269    enet_uint32   packetThrottleInterval;
00270    enet_uint32   lastRoundTripTime;
00271    enet_uint32   lowestRoundTripTime;
00272    enet_uint32   lastRoundTripTimeVariance;
00273    enet_uint32   highestRoundTripTimeVariance;
00274    enet_uint32   roundTripTime;            
00275    enet_uint32   roundTripTimeVariance;
00276    enet_uint32   mtu;
00277    enet_uint32   windowSize;
00278    enet_uint32   reliableDataInTransit;
00279    enet_uint16   outgoingReliableSequenceNumber;
00280    ENetList      acknowledgements;
00281    ENetList      sentReliableCommands;
00282    ENetList      sentUnreliableCommands;
00283    ENetList      outgoingReliableCommands;
00284    ENetList      outgoingUnreliableCommands;
00285    ENetList      dispatchedCommands;
00286    int           needsDispatch;
00287    enet_uint16   incomingUnsequencedGroup;
00288    enet_uint16   outgoingUnsequencedGroup;
00289    enet_uint32   unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32]; 
00290    enet_uint32   eventData;
00291 } ENetPeer;
00292 
00295 typedef struct _ENetCompressor
00296 {
00298    void * context;
00300    size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit);
00302    size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit);
00304    void (ENET_CALLBACK * destroy) (void * context);
00305 } ENetCompressor;
00306 
00308 typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount);
00309  
00326 typedef struct _ENetHost
00327 {
00328    ENetSocket           socket;
00329    ENetAddress          address;                     
00330    enet_uint32          incomingBandwidth;           
00331    enet_uint32          outgoingBandwidth;           
00332    enet_uint32          bandwidthThrottleEpoch;
00333    enet_uint32          mtu;
00334    enet_uint32          randomSeed;
00335    int                  recalculateBandwidthLimits;
00336    ENetPeer *           peers;                       
00337    size_t               peerCount;                   
00338    size_t               channelLimit;                
00339    enet_uint32          serviceTime;
00340    ENetList             dispatchQueue;
00341    int                  continueSending;
00342    size_t               packetSize;
00343    enet_uint16          headerFlags;
00344    ENetProtocol         commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS];
00345    size_t               commandCount;
00346    ENetBuffer           buffers [ENET_BUFFER_MAXIMUM];
00347    size_t               bufferCount;
00348    ENetChecksumCallback checksum;                    
00349    ENetCompressor       compressor;
00350    enet_uint8           packetData [2][ENET_PROTOCOL_MAXIMUM_MTU];
00351    ENetAddress          receivedAddress;
00352    enet_uint8 *         receivedData;
00353    size_t               receivedDataLength;
00354    enet_uint32          totalSentData;               
00355    enet_uint32          totalSentPackets;            
00356    enet_uint32          totalReceivedData;           
00357    enet_uint32          totalReceivedPackets;        
00358 } ENetHost;
00359 
00363 typedef enum _ENetEventType
00364 {
00366    ENET_EVENT_TYPE_NONE       = 0,  
00367 
00371    ENET_EVENT_TYPE_CONNECT    = 1,  
00372 
00380    ENET_EVENT_TYPE_DISCONNECT = 2,  
00381 
00388    ENET_EVENT_TYPE_RECEIVE    = 3
00389 } ENetEventType;
00390 
00396 typedef struct _ENetEvent 
00397 {
00398    ENetEventType        type;      
00399    ENetPeer *           peer;      
00400    enet_uint8           channelID; 
00401    enet_uint32          data;      
00402    ENetPacket *         packet;    
00403 } ENetEvent;
00404 
00414 ENET_API int enet_initialize (void);
00415 
00423 ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits);
00424 
00429 ENET_API void enet_deinitialize (void);
00430 
00439 ENET_API enet_uint32 enet_time_get (void);
00443 ENET_API void enet_time_set (enet_uint32);
00444 
00448 ENET_API ENetSocket enet_socket_create (ENetSocketType);
00449 ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *);
00450 ENET_API int        enet_socket_listen (ENetSocket, int);
00451 ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *);
00452 ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *);
00453 ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t);
00454 ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t);
00455 ENET_API int        enet_socket_wait (ENetSocket, enet_uint32 *, enet_uint32);
00456 ENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int);
00457 ENET_API void       enet_socket_destroy (ENetSocket);
00458 ENET_API int        enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32);
00459 
00473 ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName);
00474 
00483 ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength);
00484 
00493 ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength);
00494 
00497 ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32);
00498 ENET_API void         enet_packet_destroy (ENetPacket *);
00499 ENET_API int          enet_packet_resize  (ENetPacket *, size_t);
00500 extern enet_uint32    enet_crc32 (const ENetBuffer *, size_t);
00501                 
00502 ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32);
00503 ENET_API void       enet_host_destroy (ENetHost *);
00504 ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32);
00505 ENET_API int        enet_host_check_events (ENetHost *, ENetEvent *);
00506 ENET_API int        enet_host_service (ENetHost *, ENetEvent *, enet_uint32);
00507 ENET_API void       enet_host_flush (ENetHost *);
00508 ENET_API void       enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *);
00509 ENET_API void       enet_host_compress (ENetHost *, const ENetCompressor *);
00510 ENET_API int        enet_host_compress_with_range_coder (ENetHost * host);
00511 ENET_API void       enet_host_channel_limit (ENetHost *, size_t);
00512 ENET_API void       enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32);
00513 extern   void       enet_host_bandwidth_throttle (ENetHost *);
00514 
00515 ENET_API int                 enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *);
00516 ENET_API ENetPacket *        enet_peer_receive (ENetPeer *, enet_uint8 * channelID);
00517 ENET_API void                enet_peer_ping (ENetPeer *);
00518 ENET_API void                enet_peer_reset (ENetPeer *);
00519 ENET_API void                enet_peer_disconnect (ENetPeer *, enet_uint32);
00520 ENET_API void                enet_peer_disconnect_now (ENetPeer *, enet_uint32);
00521 ENET_API void                enet_peer_disconnect_later (ENetPeer *, enet_uint32);
00522 ENET_API void                enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32);
00523 extern int                   enet_peer_throttle (ENetPeer *, enet_uint32);
00524 extern void                  enet_peer_reset_queues (ENetPeer *);
00525 extern void                  enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *);
00526 extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16);
00527 extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32);
00528 extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16);
00529 extern void                  enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *);
00530 extern void                  enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *);
00531 
00532 ENET_API void * enet_range_coder_create (void);
00533 ENET_API void   enet_range_coder_destroy (void *);
00534 ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t);
00535 ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t);
00536    
00537 extern size_t enet_protocol_command_size (enet_uint8);
00538 
00539 #ifdef __cplusplus
00540 }
00541 #endif
00542 
00543 #endif /* __ENET_ENET_H__ */
00544