| 1 | /**  | 
|---|
| 2 |  @file  enet.h | 
|---|
| 3 |  @brief ENet public header file | 
|---|
| 4 | */ | 
|---|
| 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 1 | 
|---|
| 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 | } ENetSocketOption; | 
|---|
| 55 |  | 
|---|
| 56 | typedef struct _ENetHostAddress | 
|---|
| 57 | { | 
|---|
| 58 |    enet_uint8 addr[16]; | 
|---|
| 59 | } ENetHostAddress; | 
|---|
| 60 |  | 
|---|
| 61 | #define ENET_HOST_ANY_INIT { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } }                         /**< specifies the default server host (macro for variable initialization) */ | 
|---|
| 62 | static const ENetHostAddress ENET_HOST_ANY = ENET_HOST_ANY_INIT;                           /**< specifies the default server host (global constant variable) */ | 
|---|
| 63 | #define ENET_IPV4MAPPED_PREFIX_INIT { { 0,0,0,0,0,0,0,0,0,0,0xff,0xff,0,0,0,0 } }          /**< specifies the IPv4-mapped IPv6 prefix (macro for variable initialization) */ | 
|---|
| 64 | static const ENetHostAddress ENET_IPV4MAPPED_PREFIX = ENET_IPV4MAPPED_PREFIX_INIT;         /**< specifies the IPv4-mapped IPv6 prefix (global constant variable) */ | 
|---|
| 65 | #define ENET_HOST_BROADCAST_INIT { { 0,0,0,0,0,0,0,0,0,0,0xff,0xff,0xff,0xff,0xff,0xff } } /**< specifies a IPv4 subnet-wide broadcast (macro for variable initialization) */ | 
|---|
| 66 | static const ENetHostAddress ENET_HOST_BROADCAST = ENET_HOST_BROADCAST_INIT;               /**< specifies a IPv4 subnet-wide broadcast (global constant variable) */ | 
|---|
| 67 | enum { | 
|---|
| 68 |     ENET_IPV4MAPPED_PREFIX_LEN = 12,                                                       /**< specifies the length of the IPv4-mapped IPv6 prefix */ | 
|---|
| 69 |     ENET_PORT_ANY              = 0                                                         /**< specifies that a port should be automatically chosen */ | 
|---|
| 70 | }; | 
|---|
| 71 |  | 
|---|
| 72 | /** | 
|---|
| 73 |  * Portable internet address structure.  | 
|---|
| 74 |  * | 
|---|
| 75 |  * The host must be specified in network byte-order, and the port must be in host  | 
|---|
| 76 |  * byte-order. The constant ENET_HOST_ANY may be used to specify the default  | 
|---|
| 77 |  * server host. The constant ENET_HOST_BROADCAST may be used to specify the | 
|---|
| 78 |  * broadcast address (255.255.255.255).  This makes sense for enet_host_connect, | 
|---|
| 79 |  * but not for enet_host_create.  Once a server responds to a broadcast, the | 
|---|
| 80 |  * address is updated from ENET_HOST_BROADCAST to the server's actual IP address. | 
|---|
| 81 |  */ | 
|---|
| 82 | typedef struct _ENetAddress | 
|---|
| 83 | { | 
|---|
| 84 |    ENetHostAddress host; | 
|---|
| 85 | #ifdef WIN32 | 
|---|
| 86 |    u_long scopeID; | 
|---|
| 87 | #else | 
|---|
| 88 |    uint32_t scopeID; | 
|---|
| 89 | #endif | 
|---|
| 90 |    enet_uint16 port; | 
|---|
| 91 | } ENetAddress; | 
|---|
| 92 |  | 
|---|
| 93 | /** | 
|---|
| 94 |  * The address family type. | 
|---|
| 95 |  */ | 
|---|
| 96 | typedef enum _ENetAddressFamily | 
|---|
| 97 | { | 
|---|
| 98 |     ENET_NO_ADDRESS_FAMILY = 0, | 
|---|
| 99 |     ENET_IPV4 = (1 << 0), | 
|---|
| 100 |     ENET_IPV6 = (1 << 1) | 
|---|
| 101 | } ENetAddressFamily; | 
|---|
| 102 |  | 
|---|
| 103 | /** | 
|---|
| 104 |  * Packet flag bit constants. | 
|---|
| 105 |  * | 
|---|
| 106 |  * The host must be specified in network byte-order, and the port must be in | 
|---|
| 107 |  * host byte-order. The constant ENET_HOST_ANY may be used to specify the | 
|---|
| 108 |  * default server host. | 
|---|
| 109 |   | 
|---|
| 110 |    @sa ENetPacket | 
|---|
| 111 | */ | 
|---|
| 112 | typedef enum _ENetPacketFlag | 
|---|
| 113 | { | 
|---|
| 114 |    /** packet must be received by the target peer and resend attempts should be | 
|---|
| 115 |      * made until the packet is delivered */ | 
|---|
| 116 |    ENET_PACKET_FLAG_RELIABLE    = (1 << 0), | 
|---|
| 117 |    /** packet will not be sequenced with other packets | 
|---|
| 118 |      * not supported for reliable packets | 
|---|
| 119 |      */ | 
|---|
| 120 |    ENET_PACKET_FLAG_UNSEQUENCED = (1 << 1), | 
|---|
| 121 |    /** packet will not allocate data, and user must supply it instead */ | 
|---|
| 122 |    ENET_PACKET_FLAG_NO_ALLOCATE = (1 << 2) | 
|---|
| 123 | } ENetPacketFlag; | 
|---|
| 124 |  | 
|---|
| 125 | struct _ENetPacket; | 
|---|
| 126 | typedef void (ENET_CALLBACK * ENetPacketFreeCallback) (struct _ENetPacket *); | 
|---|
| 127 |  | 
|---|
| 128 | /** | 
|---|
| 129 |  * ENet packet structure. | 
|---|
| 130 |  * | 
|---|
| 131 |  * An ENet data packet that may be sent to or received from a peer. The shown  | 
|---|
| 132 |  * fields should only be read and never modified. The data field contains the  | 
|---|
| 133 |  * allocated data for the packet. The dataLength fields specifies the length  | 
|---|
| 134 |  * of the allocated data.  The flags field is either 0 (specifying no flags),  | 
|---|
| 135 |  * or a bitwise-or of any combination of the following flags: | 
|---|
| 136 |  * | 
|---|
| 137 |  *    ENET_PACKET_FLAG_RELIABLE - packet must be received by the target peer | 
|---|
| 138 |  *    and resend attempts should be made until the packet is delivered | 
|---|
| 139 |  * | 
|---|
| 140 |  *    ENET_PACKET_FLAG_UNSEQUENCED - packet will not be sequenced with other packets  | 
|---|
| 141 |  *    (not supported for reliable packets) | 
|---|
| 142 |  * | 
|---|
| 143 |  *    ENET_PACKET_FLAG_NO_ALLOCATE - packet will not allocate data, and user must supply it instead | 
|---|
| 144 |   | 
|---|
| 145 |    @sa ENetPacketFlag | 
|---|
| 146 |  */ | 
|---|
| 147 | typedef struct _ENetPacket | 
|---|
| 148 | { | 
|---|
| 149 |    size_t                   referenceCount;  /**< internal use only */ | 
|---|
| 150 |    enet_uint32              flags;           /**< bitwise-or of ENetPacketFlag constants */ | 
|---|
| 151 |    enet_uint8 *             data;            /**< allocated data for packet */ | 
|---|
| 152 |    size_t                   dataLength;      /**< length of data */ | 
|---|
| 153 |    ENetPacketFreeCallback   freeCallback;    /**< function to be called when the packet is no longer in use */ | 
|---|
| 154 | } ENetPacket; | 
|---|
| 155 |  | 
|---|
| 156 | typedef struct _ENetAcknowledgement | 
|---|
| 157 | { | 
|---|
| 158 |    ENetListNode acknowledgementList; | 
|---|
| 159 |    enet_uint32  sentTime; | 
|---|
| 160 |    ENetProtocol command; | 
|---|
| 161 | } ENetAcknowledgement; | 
|---|
| 162 |  | 
|---|
| 163 | typedef struct _ENetOutgoingCommand | 
|---|
| 164 | { | 
|---|
| 165 |    ENetListNode outgoingCommandList; | 
|---|
| 166 |    enet_uint16  reliableSequenceNumber; | 
|---|
| 167 |    enet_uint16  unreliableSequenceNumber; | 
|---|
| 168 |    enet_uint32  sentTime; | 
|---|
| 169 |    enet_uint32  roundTripTimeout; | 
|---|
| 170 |    enet_uint32  roundTripTimeoutLimit; | 
|---|
| 171 |    enet_uint32  fragmentOffset; | 
|---|
| 172 |    enet_uint16  fragmentLength; | 
|---|
| 173 |    enet_uint16  sendAttempts; | 
|---|
| 174 |    ENetProtocol command; | 
|---|
| 175 |    ENetPacket * packet; | 
|---|
| 176 | } ENetOutgoingCommand; | 
|---|
| 177 |  | 
|---|
| 178 | typedef struct _ENetIncomingCommand | 
|---|
| 179 | {   | 
|---|
| 180 |    ENetListNode     incomingCommandList; | 
|---|
| 181 |    enet_uint16      reliableSequenceNumber; | 
|---|
| 182 |    enet_uint16      unreliableSequenceNumber; | 
|---|
| 183 |    ENetProtocol     command; | 
|---|
| 184 |    enet_uint32      fragmentCount; | 
|---|
| 185 |    enet_uint32      fragmentsRemaining; | 
|---|
| 186 |    enet_uint32 *    fragments; | 
|---|
| 187 |    ENetPacket *     packet; | 
|---|
| 188 | } ENetIncomingCommand; | 
|---|
| 189 |  | 
|---|
| 190 | typedef enum _ENetPeerState | 
|---|
| 191 | { | 
|---|
| 192 |    ENET_PEER_STATE_DISCONNECTED                = 0, | 
|---|
| 193 |    ENET_PEER_STATE_CONNECTING                  = 1, | 
|---|
| 194 |    ENET_PEER_STATE_ACKNOWLEDGING_CONNECT       = 2, | 
|---|
| 195 |    ENET_PEER_STATE_CONNECTION_PENDING          = 3, | 
|---|
| 196 |    ENET_PEER_STATE_CONNECTION_SUCCEEDED        = 4, | 
|---|
| 197 |    ENET_PEER_STATE_CONNECTED                   = 5, | 
|---|
| 198 |    ENET_PEER_STATE_DISCONNECT_LATER            = 6, | 
|---|
| 199 |    ENET_PEER_STATE_DISCONNECTING               = 7, | 
|---|
| 200 |    ENET_PEER_STATE_ACKNOWLEDGING_DISCONNECT    = 8, | 
|---|
| 201 |    ENET_PEER_STATE_ZOMBIE                      = 9  | 
|---|
| 202 | } ENetPeerState; | 
|---|
| 203 |  | 
|---|
| 204 | #ifndef ENET_BUFFER_MAXIMUM | 
|---|
| 205 | #define ENET_BUFFER_MAXIMUM (1 + 2 * ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS) | 
|---|
| 206 | #endif | 
|---|
| 207 |  | 
|---|
| 208 | enum | 
|---|
| 209 | { | 
|---|
| 210 |    ENET_HOST_RECEIVE_BUFFER_SIZE          = 256 * 1024, | 
|---|
| 211 |    ENET_HOST_SEND_BUFFER_SIZE             = 256 * 1024, | 
|---|
| 212 |    ENET_HOST_BANDWIDTH_THROTTLE_INTERVAL  = 1000, | 
|---|
| 213 |    ENET_HOST_DEFAULT_MTU                  = 1400, | 
|---|
| 214 |  | 
|---|
| 215 |    ENET_PEER_DEFAULT_ROUND_TRIP_TIME      = 500, | 
|---|
| 216 |    ENET_PEER_DEFAULT_PACKET_THROTTLE      = 32, | 
|---|
| 217 |    ENET_PEER_PACKET_THROTTLE_SCALE        = 32, | 
|---|
| 218 |    ENET_PEER_PACKET_THROTTLE_COUNTER      = 7,  | 
|---|
| 219 |    ENET_PEER_PACKET_THROTTLE_ACCELERATION = 2, | 
|---|
| 220 |    ENET_PEER_PACKET_THROTTLE_DECELERATION = 2, | 
|---|
| 221 |    ENET_PEER_PACKET_THROTTLE_INTERVAL     = 5000, | 
|---|
| 222 |    ENET_PEER_PACKET_LOSS_SCALE            = (1 << 16), | 
|---|
| 223 |    ENET_PEER_PACKET_LOSS_INTERVAL         = 10000, | 
|---|
| 224 |    ENET_PEER_WINDOW_SIZE_SCALE            = 64 * 1024, | 
|---|
| 225 |    ENET_PEER_TIMEOUT_LIMIT                = 32, | 
|---|
| 226 |    ENET_PEER_TIMEOUT_MINIMUM              = 5000, | 
|---|
| 227 |    ENET_PEER_TIMEOUT_MAXIMUM              = 30000, | 
|---|
| 228 |    ENET_PEER_PING_INTERVAL                = 500, | 
|---|
| 229 |    ENET_PEER_UNSEQUENCED_WINDOWS          = 64, | 
|---|
| 230 |    ENET_PEER_UNSEQUENCED_WINDOW_SIZE      = 1024, | 
|---|
| 231 |    ENET_PEER_FREE_UNSEQUENCED_WINDOWS     = 32, | 
|---|
| 232 |    ENET_PEER_RELIABLE_WINDOWS             = 16, | 
|---|
| 233 |    ENET_PEER_RELIABLE_WINDOW_SIZE         = 0x1000, | 
|---|
| 234 |    ENET_PEER_FREE_RELIABLE_WINDOWS        = 8 | 
|---|
| 235 | }; | 
|---|
| 236 |  | 
|---|
| 237 | typedef struct _ENetChannel | 
|---|
| 238 | { | 
|---|
| 239 |    enet_uint16  outgoingReliableSequenceNumber; | 
|---|
| 240 |    enet_uint16  outgoingUnreliableSequenceNumber; | 
|---|
| 241 |    enet_uint16  usedReliableWindows; | 
|---|
| 242 |    enet_uint16  reliableWindows [ENET_PEER_RELIABLE_WINDOWS]; | 
|---|
| 243 |    enet_uint16  incomingReliableSequenceNumber; | 
|---|
| 244 |    ENetList     incomingReliableCommands; | 
|---|
| 245 |    ENetList     incomingUnreliableCommands; | 
|---|
| 246 | } ENetChannel; | 
|---|
| 247 |  | 
|---|
| 248 | /** | 
|---|
| 249 |  * An ENet peer which data packets may be sent or received from.  | 
|---|
| 250 |  * | 
|---|
| 251 |  * No fields should be modified unless otherwise specified.  | 
|---|
| 252 |  */ | 
|---|
| 253 | typedef struct _ENetPeer | 
|---|
| 254 | {  | 
|---|
| 255 |    ENetListNode  dispatchList; | 
|---|
| 256 |    struct _ENetHost * host; | 
|---|
| 257 |    enet_uint16   outgoingPeerID; | 
|---|
| 258 |    enet_uint16   incomingPeerID; | 
|---|
| 259 |    enet_uint32   connectID; | 
|---|
| 260 |    enet_uint8    outgoingSessionID; | 
|---|
| 261 |    enet_uint8    incomingSessionID; | 
|---|
| 262 |    ENetAddress   address;            /**< Internet address of the peer */ | 
|---|
| 263 |    void *        data;               /**< Application private data, may be freely modified */ | 
|---|
| 264 |    ENetPeerState state; | 
|---|
| 265 |    ENetChannel * channels; | 
|---|
| 266 |    size_t        channelCount;       /**< Number of channels allocated for communication with peer */ | 
|---|
| 267 |    enet_uint32   incomingBandwidth;  /**< Downstream bandwidth of the client in bytes/second */ | 
|---|
| 268 |    enet_uint32   outgoingBandwidth;  /**< Upstream bandwidth of the client in bytes/second */ | 
|---|
| 269 |    enet_uint32   incomingBandwidthThrottleEpoch; | 
|---|
| 270 |    enet_uint32   outgoingBandwidthThrottleEpoch; | 
|---|
| 271 |    enet_uint32   incomingDataTotal; | 
|---|
| 272 |    enet_uint32   outgoingDataTotal; | 
|---|
| 273 |    enet_uint32   lastSendTime; | 
|---|
| 274 |    enet_uint32   lastReceiveTime; | 
|---|
| 275 |    enet_uint32   nextTimeout; | 
|---|
| 276 |    enet_uint32   earliestTimeout; | 
|---|
| 277 |    enet_uint32   packetLossEpoch; | 
|---|
| 278 |    enet_uint32   packetsSent; | 
|---|
| 279 |    enet_uint32   packetsLost; | 
|---|
| 280 |    enet_uint32   packetLoss;          /**< mean packet loss of reliable packets as a ratio with respect to the constant ENET_PEER_PACKET_LOSS_SCALE */ | 
|---|
| 281 |    enet_uint32   packetLossVariance; | 
|---|
| 282 |    enet_uint32   packetThrottle; | 
|---|
| 283 |    enet_uint32   packetThrottleLimit; | 
|---|
| 284 |    enet_uint32   packetThrottleCounter; | 
|---|
| 285 |    enet_uint32   packetThrottleEpoch; | 
|---|
| 286 |    enet_uint32   packetThrottleAcceleration; | 
|---|
| 287 |    enet_uint32   packetThrottleDeceleration; | 
|---|
| 288 |    enet_uint32   packetThrottleInterval; | 
|---|
| 289 |    enet_uint32   lastRoundTripTime; | 
|---|
| 290 |    enet_uint32   lowestRoundTripTime; | 
|---|
| 291 |    enet_uint32   lastRoundTripTimeVariance; | 
|---|
| 292 |    enet_uint32   highestRoundTripTimeVariance; | 
|---|
| 293 |    enet_uint32   roundTripTime;            /**< mean round trip time (RTT), in milliseconds, between sending a reliable packet and receiving its acknowledgement */ | 
|---|
| 294 |    enet_uint32   roundTripTimeVariance; | 
|---|
| 295 |    enet_uint32   mtu; | 
|---|
| 296 |    enet_uint32   windowSize; | 
|---|
| 297 |    enet_uint32   reliableDataInTransit; | 
|---|
| 298 |    enet_uint16   outgoingReliableSequenceNumber; | 
|---|
| 299 |    ENetList      acknowledgements; | 
|---|
| 300 |    ENetList      sentReliableCommands; | 
|---|
| 301 |    ENetList      sentUnreliableCommands; | 
|---|
| 302 |    ENetList      outgoingReliableCommands; | 
|---|
| 303 |    ENetList      outgoingUnreliableCommands; | 
|---|
| 304 |    ENetList      dispatchedCommands; | 
|---|
| 305 |    int           needsDispatch; | 
|---|
| 306 |    enet_uint16   incomingUnsequencedGroup; | 
|---|
| 307 |    enet_uint16   outgoingUnsequencedGroup; | 
|---|
| 308 |    enet_uint32   unsequencedWindow [ENET_PEER_UNSEQUENCED_WINDOW_SIZE / 32];  | 
|---|
| 309 |    enet_uint32   eventData; | 
|---|
| 310 | } ENetPeer; | 
|---|
| 311 |  | 
|---|
| 312 | /** An ENet packet compressor for compressing UDP packets before socket sends or receives. | 
|---|
| 313 |  */ | 
|---|
| 314 | typedef struct _ENetCompressor | 
|---|
| 315 | { | 
|---|
| 316 |    /** Context data for the compressor. Must be non-NULL. */ | 
|---|
| 317 |    void * context; | 
|---|
| 318 |    /** Compresses from inBuffers[0:inBufferCount-1], containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ | 
|---|
| 319 |    size_t (ENET_CALLBACK * compress) (void * context, const ENetBuffer * inBuffers, size_t inBufferCount, size_t inLimit, enet_uint8 * outData, size_t outLimit); | 
|---|
| 320 |    /** Decompresses from inData, containing inLimit bytes, to outData, outputting at most outLimit bytes. Should return 0 on failure. */ | 
|---|
| 321 |    size_t (ENET_CALLBACK * decompress) (void * context, const enet_uint8 * inData, size_t inLimit, enet_uint8 * outData, size_t outLimit); | 
|---|
| 322 |    /** Destroys the context when compression is disabled or the host is destroyed. May be NULL. */ | 
|---|
| 323 |    void (ENET_CALLBACK * destroy) (void * context); | 
|---|
| 324 | } ENetCompressor; | 
|---|
| 325 |  | 
|---|
| 326 | /** Callback that computes the checksum of the data held in buffers[0:bufferCount-1] */ | 
|---|
| 327 | typedef enet_uint32 (ENET_CALLBACK * ENetChecksumCallback) (const ENetBuffer * buffers, size_t bufferCount); | 
|---|
| 328 |   | 
|---|
| 329 | /** An ENet host for communicating with peers. | 
|---|
| 330 |   * | 
|---|
| 331 |   * No fields should be modified unless otherwise stated. | 
|---|
| 332 |  | 
|---|
| 333 |     @sa enet_host_create() | 
|---|
| 334 |     @sa enet_host_destroy() | 
|---|
| 335 |     @sa enet_host_connect() | 
|---|
| 336 |     @sa enet_host_service() | 
|---|
| 337 |     @sa enet_host_flush() | 
|---|
| 338 |     @sa enet_host_broadcast() | 
|---|
| 339 |     @sa enet_host_compress() | 
|---|
| 340 |     @sa enet_host_compress_with_range_coder() | 
|---|
| 341 |     @sa enet_host_channel_limit() | 
|---|
| 342 |     @sa enet_host_bandwidth_limit() | 
|---|
| 343 |     @sa enet_host_bandwidth_throttle() | 
|---|
| 344 |   */ | 
|---|
| 345 | typedef struct _ENetHost | 
|---|
| 346 | { | 
|---|
| 347 |    ENetSocket           socket4; | 
|---|
| 348 |    ENetSocket           socket6; | 
|---|
| 349 |    ENetAddress          address;                     /**< Internet address of the host */ | 
|---|
| 350 |    enet_uint32          incomingBandwidth;           /**< downstream bandwidth of the host */ | 
|---|
| 351 |    enet_uint32          outgoingBandwidth;           /**< upstream bandwidth of the host */ | 
|---|
| 352 |    enet_uint32          bandwidthThrottleEpoch; | 
|---|
| 353 |    enet_uint32          mtu; | 
|---|
| 354 |    enet_uint32          randomSeed; | 
|---|
| 355 |    int                  recalculateBandwidthLimits; | 
|---|
| 356 |    ENetPeer *           peers;                       /**< array of peers allocated for this host */ | 
|---|
| 357 |    size_t               peerCount;                   /**< number of peers allocated for this host */ | 
|---|
| 358 |    size_t               channelLimit;                /**< maximum number of channels allowed for connected peers */ | 
|---|
| 359 |    enet_uint32          serviceTime; | 
|---|
| 360 |    ENetList             dispatchQueue; | 
|---|
| 361 |    int                  continueSending; | 
|---|
| 362 |    size_t               packetSize; | 
|---|
| 363 |    enet_uint16          headerFlags; | 
|---|
| 364 |    ENetProtocol         commands [ENET_PROTOCOL_MAXIMUM_PACKET_COMMANDS]; | 
|---|
| 365 |    size_t               commandCount; | 
|---|
| 366 |    ENetBuffer           buffers [ENET_BUFFER_MAXIMUM]; | 
|---|
| 367 |    size_t               bufferCount; | 
|---|
| 368 |    ENetChecksumCallback checksum;                    /**< callback the user can set to enable packet checksums for this host */ | 
|---|
| 369 |    ENetCompressor       compressor; | 
|---|
| 370 |    enet_uint8           packetData [2][ENET_PROTOCOL_MAXIMUM_MTU]; | 
|---|
| 371 |    ENetAddress          receivedAddress; | 
|---|
| 372 |    enet_uint8 *         receivedData; | 
|---|
| 373 |    size_t               receivedDataLength; | 
|---|
| 374 |    enet_uint32          totalSentData;               /**< total data sent, user should reset to 0 as needed to prevent overflow */ | 
|---|
| 375 |    enet_uint32          totalSentPackets;            /**< total UDP packets sent, user should reset to 0 as needed to prevent overflow */ | 
|---|
| 376 |    enet_uint32          totalReceivedData;           /**< total data received, user should reset to 0 as needed to prevent overflow */ | 
|---|
| 377 |    enet_uint32          totalReceivedPackets;        /**< total UDP packets received, user should reset to 0 as needed to prevent overflow */ | 
|---|
| 378 | } ENetHost; | 
|---|
| 379 |  | 
|---|
| 380 | /** | 
|---|
| 381 |  * An ENet event type, as specified in @ref ENetEvent. | 
|---|
| 382 |  */ | 
|---|
| 383 | typedef enum _ENetEventType | 
|---|
| 384 | { | 
|---|
| 385 |    /** no event occurred within the specified time limit */ | 
|---|
| 386 |    ENET_EVENT_TYPE_NONE       = 0,   | 
|---|
| 387 |  | 
|---|
| 388 |    /** a connection request initiated by enet_host_connect has completed.   | 
|---|
| 389 |      * The peer field contains the peer which successfully connected.  | 
|---|
| 390 |      */ | 
|---|
| 391 |    ENET_EVENT_TYPE_CONNECT    = 1,   | 
|---|
| 392 |  | 
|---|
| 393 |    /** a peer has disconnected.  This event is generated on a successful  | 
|---|
| 394 |      * completion of a disconnect initiated by enet_pper_disconnect, if  | 
|---|
| 395 |      * a peer has timed out, or if a connection request intialized by  | 
|---|
| 396 |      * enet_host_connect has timed out.  The peer field contains the peer  | 
|---|
| 397 |      * which disconnected. The data field contains user supplied data  | 
|---|
| 398 |      * describing the disconnection, or 0, if none is available. | 
|---|
| 399 |      */ | 
|---|
| 400 |    ENET_EVENT_TYPE_DISCONNECT = 2,   | 
|---|
| 401 |  | 
|---|
| 402 |    /** a packet has been received from a peer.  The peer field specifies the | 
|---|
| 403 |      * peer which sent the packet.  The channelID field specifies the channel | 
|---|
| 404 |      * number upon which the packet was received.  The packet field contains | 
|---|
| 405 |      * the packet that was received; this packet must be destroyed with | 
|---|
| 406 |      * enet_packet_destroy after use. | 
|---|
| 407 |      */ | 
|---|
| 408 |    ENET_EVENT_TYPE_RECEIVE    = 3 | 
|---|
| 409 | } ENetEventType; | 
|---|
| 410 |  | 
|---|
| 411 | /** | 
|---|
| 412 |  * An ENet event as returned by enet_host_service(). | 
|---|
| 413 |     | 
|---|
| 414 |    @sa enet_host_service | 
|---|
| 415 |  */ | 
|---|
| 416 | typedef struct _ENetEvent  | 
|---|
| 417 | { | 
|---|
| 418 |    ENetEventType        type;      /**< type of the event */ | 
|---|
| 419 |    ENetPeer *           peer;      /**< peer that generated a connect, disconnect or receive event */ | 
|---|
| 420 |    enet_uint8           channelID; /**< channel on the peer that generated the event, if appropriate */ | 
|---|
| 421 |    enet_uint32          data;      /**< data associated with the event, if appropriate */ | 
|---|
| 422 |    ENetPacket *         packet;    /**< packet associated with the event, if appropriate */ | 
|---|
| 423 | } ENetEvent; | 
|---|
| 424 |  | 
|---|
| 425 | /** @defgroup global ENet global functions | 
|---|
| 426 |     @{  | 
|---|
| 427 | */ | 
|---|
| 428 |  | 
|---|
| 429 | /**  | 
|---|
| 430 |   Initializes ENet globally.  Must be called prior to using any functions in | 
|---|
| 431 |   ENet. | 
|---|
| 432 |   @returns 0 on success, < 0 on failure | 
|---|
| 433 | */ | 
|---|
| 434 | ENET_API int enet_initialize (void); | 
|---|
| 435 |  | 
|---|
| 436 | /**  | 
|---|
| 437 |   Initializes ENet globally and supplies user-overridden callbacks. Must be called prior to using any functions in ENet. Do not use enet_initialize() if you use this variant. Make sure the ENetCallbacks structure is zeroed out so that any additional callbacks added in future versions will be properly ignored. | 
|---|
| 438 |  | 
|---|
| 439 |   @param version the constant ENET_VERSION should be supplied so ENet knows which version of ENetCallbacks struct to use | 
|---|
| 440 |   @param inits user-overriden callbacks where any NULL callbacks will use ENet's defaults | 
|---|
| 441 |   @returns 0 on success, < 0 on failure | 
|---|
| 442 | */ | 
|---|
| 443 | ENET_API int enet_initialize_with_callbacks (ENetVersion version, const ENetCallbacks * inits); | 
|---|
| 444 |  | 
|---|
| 445 | /**  | 
|---|
| 446 |   Shuts down ENet globally.  Should be called when a program that has | 
|---|
| 447 |   initialized ENet exits. | 
|---|
| 448 | */ | 
|---|
| 449 | ENET_API void enet_deinitialize (void); | 
|---|
| 450 |  | 
|---|
| 451 | /** @} */ | 
|---|
| 452 |  | 
|---|
| 453 | /** @defgroup private ENet private implementation functions */ | 
|---|
| 454 |  | 
|---|
| 455 | /** | 
|---|
| 456 |   Returns the wall-time in milliseconds.  Its initial value is unspecified | 
|---|
| 457 |   unless otherwise set. | 
|---|
| 458 |   */ | 
|---|
| 459 | ENET_API enet_uint32 enet_time_get (void); | 
|---|
| 460 | /** | 
|---|
| 461 |   Sets the current wall-time in milliseconds. | 
|---|
| 462 |   */ | 
|---|
| 463 | ENET_API void enet_time_set (enet_uint32); | 
|---|
| 464 |  | 
|---|
| 465 | /** @defgroup socket ENet socket functions | 
|---|
| 466 |     @{ | 
|---|
| 467 | */ | 
|---|
| 468 | ENET_API ENetSocket enet_socket_create (ENetSocketType, ENetAddressFamily); | 
|---|
| 469 | ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *, ENetAddressFamily); | 
|---|
| 470 | ENET_API int        enet_socket_listen (ENetSocket, int); | 
|---|
| 471 | ENET_API ENetSocket enet_socket_accept (ENetSocket, ENetAddress *, ENetAddressFamily); | 
|---|
| 472 | ENET_API int        enet_socket_connect (ENetSocket, const ENetAddress *, ENetAddressFamily); | 
|---|
| 473 | ENET_API int        enet_socket_send (ENetSocket, const ENetAddress *, const ENetBuffer *, size_t, ENetAddressFamily); | 
|---|
| 474 | ENET_API int        enet_socket_receive (ENetSocket, ENetAddress *, ENetBuffer *, size_t, ENetAddressFamily); | 
|---|
| 475 | ENET_API int        enet_socket_wait (ENetSocket, ENetSocket, enet_uint32 *, enet_uint32); | 
|---|
| 476 | ENET_API int        enet_socket_set_option (ENetSocket, ENetSocketOption, int); | 
|---|
| 477 | ENET_API void       enet_socket_destroy (ENetSocket); | 
|---|
| 478 | ENET_API int        enet_socketset_select (ENetSocket, ENetSocketSet *, ENetSocketSet *, enet_uint32); | 
|---|
| 479 |  | 
|---|
| 480 | /** @} */ | 
|---|
| 481 |  | 
|---|
| 482 | /** @defgroup Address ENet address functions | 
|---|
| 483 |     @{ | 
|---|
| 484 | */ | 
|---|
| 485 | /** Attempts to resolve the host named by the parameter hostName and sets | 
|---|
| 486 |     the host field in the address parameter if successful. | 
|---|
| 487 |     @param address destination to store resolved address | 
|---|
| 488 |     @param hostName host name to lookup | 
|---|
| 489 |     @retval 0 on success | 
|---|
| 490 |     @retval < 0 on failure | 
|---|
| 491 |     @returns the address of the given hostName in address on success | 
|---|
| 492 | */ | 
|---|
| 493 | ENET_API int enet_address_set_host (ENetAddress * address, const char * hostName); | 
|---|
| 494 |  | 
|---|
| 495 | /** Gives the printable form of the ip address specified in the address parameter. | 
|---|
| 496 |     @param address    address printed | 
|---|
| 497 |     @param hostName   destination for name, must not be NULL | 
|---|
| 498 |     @param nameLength maximum length of hostName. | 
|---|
| 499 |     @returns the null-terminated name of the host in hostName on success | 
|---|
| 500 |     @retval 0 on success | 
|---|
| 501 |     @retval < 0 on failure | 
|---|
| 502 | */ | 
|---|
| 503 | ENET_API int enet_address_get_host_ip (const ENetAddress * address, char * hostName, size_t nameLength); | 
|---|
| 504 |  | 
|---|
| 505 | /** Attempts to do a reverse lookup of the host field in the address parameter. | 
|---|
| 506 |     @param address    address used for reverse lookup | 
|---|
| 507 |     @param hostName   destination for name, must not be NULL | 
|---|
| 508 |     @param nameLength maximum length of hostName. | 
|---|
| 509 |     @returns the null-terminated name of the host in hostName on success | 
|---|
| 510 |     @retval 0 on success | 
|---|
| 511 |     @retval < 0 on failure | 
|---|
| 512 | */ | 
|---|
| 513 | ENET_API int enet_address_get_host (const ENetAddress * address, char * hostName, size_t nameLength); | 
|---|
| 514 |  | 
|---|
| 515 | /** Maps an IPv4 Address to an IPv6 address. | 
|---|
| 516 |     @param address IPv4 address in network byte order | 
|---|
| 517 |     @returns the IPv4-mapped IPv6 address in network byte order | 
|---|
| 518 | */ | 
|---|
| 519 | ENET_API ENetHostAddress enet_address_map4 (enet_uint32 address); | 
|---|
| 520 |  | 
|---|
| 521 | /** Returns the Address family of an (IPv4-mapped) IPv6 address. | 
|---|
| 522 |     @param address IPv6 address | 
|---|
| 523 |     @returns address family | 
|---|
| 524 | */ | 
|---|
| 525 | ENET_API ENetAddressFamily enet_get_address_family (const ENetAddress * address); | 
|---|
| 526 |  | 
|---|
| 527 | /** @} */ | 
|---|
| 528 |  | 
|---|
| 529 | ENET_API ENetPacket * enet_packet_create (const void *, size_t, enet_uint32); | 
|---|
| 530 | ENET_API void         enet_packet_destroy (ENetPacket *); | 
|---|
| 531 | ENET_API int          enet_packet_resize  (ENetPacket *, size_t); | 
|---|
| 532 | extern enet_uint32    enet_crc32 (const ENetBuffer *, size_t); | 
|---|
| 533 |                  | 
|---|
| 534 | ENET_API ENetHost * enet_host_create (const ENetAddress *, size_t, size_t, enet_uint32, enet_uint32); | 
|---|
| 535 | ENET_API void       enet_host_destroy (ENetHost *); | 
|---|
| 536 | ENET_API ENetPeer * enet_host_connect (ENetHost *, const ENetAddress *, size_t, enet_uint32); | 
|---|
| 537 | ENET_API int        enet_host_check_events (ENetHost *, ENetEvent *); | 
|---|
| 538 | ENET_API int        enet_host_service (ENetHost *, ENetEvent *, enet_uint32); | 
|---|
| 539 | ENET_API void       enet_host_flush (ENetHost *); | 
|---|
| 540 | ENET_API void       enet_host_broadcast (ENetHost *, enet_uint8, ENetPacket *); | 
|---|
| 541 | ENET_API void       enet_host_compress (ENetHost *, const ENetCompressor *); | 
|---|
| 542 | ENET_API int        enet_host_compress_with_range_coder (ENetHost * host); | 
|---|
| 543 | ENET_API void       enet_host_channel_limit (ENetHost *, size_t); | 
|---|
| 544 | ENET_API void       enet_host_bandwidth_limit (ENetHost *, enet_uint32, enet_uint32); | 
|---|
| 545 | extern   void       enet_host_bandwidth_throttle (ENetHost *); | 
|---|
| 546 |  | 
|---|
| 547 | ENET_API int                 enet_peer_send (ENetPeer *, enet_uint8, ENetPacket *); | 
|---|
| 548 | ENET_API ENetPacket *        enet_peer_receive (ENetPeer *, enet_uint8 * channelID); | 
|---|
| 549 | ENET_API void                enet_peer_ping (ENetPeer *); | 
|---|
| 550 | ENET_API void                enet_peer_reset (ENetPeer *); | 
|---|
| 551 | ENET_API void                enet_peer_disconnect (ENetPeer *, enet_uint32); | 
|---|
| 552 | ENET_API void                enet_peer_disconnect_now (ENetPeer *, enet_uint32); | 
|---|
| 553 | ENET_API void                enet_peer_disconnect_later (ENetPeer *, enet_uint32); | 
|---|
| 554 | ENET_API void                enet_peer_throttle_configure (ENetPeer *, enet_uint32, enet_uint32, enet_uint32); | 
|---|
| 555 | extern int                   enet_peer_throttle (ENetPeer *, enet_uint32); | 
|---|
| 556 | extern void                  enet_peer_reset_queues (ENetPeer *); | 
|---|
| 557 | extern void                  enet_peer_setup_outgoing_command (ENetPeer *, ENetOutgoingCommand *); | 
|---|
| 558 | extern ENetOutgoingCommand * enet_peer_queue_outgoing_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32, enet_uint16); | 
|---|
| 559 | extern ENetIncomingCommand * enet_peer_queue_incoming_command (ENetPeer *, const ENetProtocol *, ENetPacket *, enet_uint32); | 
|---|
| 560 | extern ENetAcknowledgement * enet_peer_queue_acknowledgement (ENetPeer *, const ENetProtocol *, enet_uint16); | 
|---|
| 561 | extern void                  enet_peer_dispatch_incoming_unreliable_commands (ENetPeer *, ENetChannel *); | 
|---|
| 562 | extern void                  enet_peer_dispatch_incoming_reliable_commands (ENetPeer *, ENetChannel *); | 
|---|
| 563 |  | 
|---|
| 564 | ENET_API void * enet_range_coder_create (void); | 
|---|
| 565 | ENET_API void   enet_range_coder_destroy (void *); | 
|---|
| 566 | ENET_API size_t enet_range_coder_compress (void *, const ENetBuffer *, size_t, size_t, enet_uint8 *, size_t); | 
|---|
| 567 | ENET_API size_t enet_range_coder_decompress (void *, const enet_uint8 *, size_t, enet_uint8 *, size_t); | 
|---|
| 568 |     | 
|---|
| 569 | extern size_t enet_protocol_command_size (enet_uint8); | 
|---|
| 570 |  | 
|---|
| 571 | #ifdef __cplusplus | 
|---|
| 572 | } | 
|---|
| 573 | #endif | 
|---|
| 574 |  | 
|---|
| 575 | #endif /* __ENET_ENET_H__ */ | 
|---|
| 576 |  | 
|---|