enet
|
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