| [7328] | 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 | 
|---|
| [8088] | 28 | #define ENET_VERSION_PATCH 1 | 
|---|
| [7328] | 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, | 
|---|
| [7377] | 53 |    ENET_SOCKOPT_REUSEADDR = 5 | 
|---|
| [7328] | 54 | } ENetSocketOption; | 
|---|
 | 55 |  | 
|---|
| [7330] | 56 | typedef struct _ENetHostAddress | 
|---|
| [7328] | 57 | { | 
|---|
| [7330] | 58 |    enet_uint8 addr[16]; | 
|---|
 | 59 | } ENetHostAddress; | 
|---|
| [7328] | 60 |  | 
|---|
| [7397] | 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) */ | 
|---|
| [7435] | 62 | static const ENetHostAddress ENET_HOST_ANY = ENET_HOST_ANY_INIT;                           /**< specifies the default server host (global constant variable) */ | 
|---|
| [7397] | 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) */ | 
|---|
| [7435] | 64 | static const ENetHostAddress ENET_IPV4MAPPED_PREFIX = ENET_IPV4MAPPED_PREFIX_INIT;         /**< specifies the IPv4-mapped IPv6 prefix (global constant variable) */ | 
|---|
| [7397] | 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) */ | 
|---|
| [7435] | 66 | static const ENetHostAddress ENET_HOST_BROADCAST = ENET_HOST_BROADCAST_INIT;               /**< specifies a IPv4 subnet-wide broadcast (global constant variable) */ | 
|---|
| [7397] | 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 | }; | 
|---|
| [7328] | 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 | { | 
|---|
| [7330] | 84 |    ENetHostAddress host; | 
|---|
| [7390] | 85 | #ifdef WIN32 | 
|---|
 | 86 |    u_long scopeID; | 
|---|
 | 87 | #else | 
|---|
 | 88 |    uint32_t scopeID; | 
|---|
 | 89 | #endif | 
|---|
| [7328] | 90 |    enet_uint16 port; | 
|---|
 | 91 | } ENetAddress; | 
|---|
 | 92 |  | 
|---|
 | 93 | /** | 
|---|
| [7377] | 94 |  * The address family type. | 
|---|
 | 95 |  */ | 
|---|
 | 96 | typedef enum _ENetAddressFamily | 
|---|
 | 97 | { | 
|---|
 | 98 |     ENET_NO_ADDRESS_FAMILY = 0, | 
|---|
| [7389] | 99 |     ENET_IPV4 = (1 << 0), | 
|---|
 | 100 |     ENET_IPV6 = (1 << 1) | 
|---|
| [7377] | 101 | } ENetAddressFamily; | 
|---|
 | 102 |  | 
|---|
 | 103 | /** | 
|---|
| [7328] | 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 | { | 
|---|
| [7377] | 347 |    ENetSocket           socket4; | 
|---|
 | 348 |    ENetSocket           socket6; | 
|---|
| [7328] | 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 | */ | 
|---|
| [7377] | 468 | ENET_API ENetSocket enet_socket_create (ENetSocketType, ENetAddressFamily); | 
|---|
 | 469 | ENET_API int        enet_socket_bind (ENetSocket, const ENetAddress *, ENetAddressFamily); | 
|---|
| [7328] | 470 | ENET_API int        enet_socket_listen (ENetSocket, int); | 
|---|
| [7377] | 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); | 
|---|
| [7328] | 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 |  | 
|---|
| [7330] | 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 | */ | 
|---|
| [7377] | 519 | ENET_API ENetHostAddress enet_address_map4 (enet_uint32 address); | 
|---|
| [7330] | 520 |  | 
|---|
| [7377] | 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 |  | 
|---|
| [7328] | 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 |  | 
|---|