UDPConnection/cpp_impl/src/UDPConnection.h

133 lines
3.9 KiB
C
Raw Normal View History

2019-06-06 07:02:48 +00:00
#ifndef UDPC_CONNECTION_H
#define UDPC_CONNECTION_H
// Determine platform macros
#define UDPC_PLATFORM_WINDOWS 1
#define UDPC_PLATFORM_MAC 2
#define UDPC_PLATFORM_LINUX 3
#define UDPC_PLATFORM_UNKNOWN 0
#if defined _WIN32
2019-06-06 07:42:07 +00:00
#define UDPC_PLATFORM UDPC_PLATFORM_WINDOWS
2019-06-06 07:02:48 +00:00
#elif defined __APPLE__
2019-06-06 07:42:07 +00:00
#define UDPC_PLATFORM UDPC_PLATFORM_MAC
2019-06-06 07:02:48 +00:00
#elif defined __linux__
2019-06-06 07:42:07 +00:00
#define UDPC_PLATFORM UDPC_PLATFORM_LINUX
2019-06-06 07:02:48 +00:00
#else
2019-06-06 07:42:07 +00:00
#define UDPC_PLATFORM UDPC_PLATFORM_UNKNOWN
2019-06-06 07:02:48 +00:00
#endif
// OS-based networking macros
#if UDPC_PLATFORM == UDPC_PLATFORM_WINDOWS
2019-06-06 07:42:07 +00:00
#include <winsock2.h>
2019-09-19 03:23:15 +00:00
#include <Ws2ipdef.h>
#include <In6addr.h>
#define UDPC_CLEANUPSOCKET(x) closesocket(x)
#define UDPC_SOCKETTYPE SOCKET
#define UDPC_IPV6_SOCKADDR_TYPE SOCKADDR_IN6
#define UDPC_IPV6_ADDR_TYPE IN6_ADDR
#define UDPC_IPV6_ADDR_SUB(addr) addr.u.Byte
#define UDPC_SOCKET_RETURN_ERROR(socket) (socket == INVALID_SOCKET)
2019-06-06 07:02:48 +00:00
#elif UDPC_PLATFORM == UDPC_PLATFORM_MAC || UDPC_PLATFORM == UDPC_PLATFORM_LINUX
2019-06-06 07:42:07 +00:00
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <unistd.h>
2019-06-06 07:02:48 +00:00
2019-09-19 03:23:15 +00:00
#define UDPC_CLEANUPSOCKET(x) close(x)
#define UDPC_SOCKETTYPE int
#define UDPC_IPV6_SOCKADDR_TYPE struct sockaddr_in6
#define UDPC_IPV6_ADDR_TYPE struct in6_addr
#define UDPC_IPV6_ADDR_SUB(addr) addr.s6_addr
#define UDPC_SOCKET_RETURN_ERROR(socket) (socket <= 0)
2019-06-06 07:02:48 +00:00
#else
2019-09-19 03:23:15 +00:00
#define UDPC_CLEANUPSOCKET(x) ((void)0)
2019-06-06 07:02:48 +00:00
#endif
// other defines
#define UDPC_PACKET_MAX_SIZE 8192
#define UDPC_DEFAULT_PROTOCOL_ID 1357924680 // 0x50f04948
2019-06-06 07:02:48 +00:00
#ifdef __cplusplus
2019-06-06 07:42:07 +00:00
#include <cstdint>
2019-06-06 07:02:48 +00:00
extern "C" {
#else
2019-06-06 07:42:07 +00:00
#include <stdint.h>
2019-06-06 07:02:48 +00:00
#endif
// Opaque struct handle to Context
struct UDPC_Context;
typedef struct UDPC_Context *UDPC_HContext;
typedef enum { UDPC_SILENT, UDPC_ERROR, UDPC_WARNING, UDPC_VERBOSE, UDPC_INFO } UDPC_LoggingType;
2019-06-06 07:02:48 +00:00
typedef struct {
2019-09-19 03:23:15 +00:00
UDPC_IPV6_ADDR_TYPE addr;
2019-09-18 08:35:14 +00:00
uint32_t scope_id;
uint16_t port;
} UDPC_ConnectionId;
2019-06-06 07:02:48 +00:00
typedef struct {
// id is stored at offset 8, size 4 (uint32_t) even for "empty" PktInfos
2019-06-06 07:02:48 +00:00
char data[UDPC_PACKET_MAX_SIZE];
2019-07-25 11:51:08 +00:00
/*
* 0x1 - connect
* 0x2 - ping
* 0x4 - no_rec_chk
* 0x8 - resending
*/
uint32_t flags;
2019-06-06 07:02:48 +00:00
uint16_t dataSize; // zero if invalid
UDPC_ConnectionId sender;
UDPC_ConnectionId receiver;
2019-07-25 11:51:08 +00:00
} UDPC_PacketInfo;
2019-06-06 07:02:48 +00:00
/// port should be in native byte order (not network/big-endian)
2019-09-19 03:23:15 +00:00
UDPC_ConnectionId UDPC_create_id(UDPC_IPV6_ADDR_TYPE addr, uint16_t port);
2019-09-19 03:23:15 +00:00
UDPC_ConnectionId UDPC_create_id_full(UDPC_IPV6_ADDR_TYPE addr, uint32_t scope_id, uint16_t port);
2019-09-18 08:35:14 +00:00
UDPC_ConnectionId UDPC_create_id_anyaddr(uint16_t port);
UDPC_HContext UDPC_init(UDPC_ConnectionId listenId, int isClient);
UDPC_HContext UDPC_init_threaded_update(UDPC_ConnectionId listenId,
2019-06-06 07:42:07 +00:00
int isClient);
2019-06-06 07:02:48 +00:00
void UDPC_destroy(UDPC_HContext ctx);
2019-06-06 07:02:48 +00:00
void UDPC_update(UDPC_HContext ctx);
2019-06-06 07:02:48 +00:00
void UDPC_client_initiate_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
int UDPC_get_queue_send_available(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
2019-06-06 07:02:48 +00:00
void UDPC_queue_send(UDPC_HContext ctx, UDPC_ConnectionId destinationId,
2019-06-06 07:42:07 +00:00
uint32_t isChecked, void *data, uint32_t size);
2019-06-06 07:02:48 +00:00
int UDPC_set_accept_new_connections(UDPC_HContext ctx, int isAccepting);
2019-06-06 07:02:48 +00:00
int UDPC_drop_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId, bool dropAllWithAddr);
int UDPC_has_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
uint32_t UDPC_set_protocol_id(UDPC_HContext ctx, uint32_t id);
2019-06-06 07:02:48 +00:00
UDPC_LoggingType UDPC_set_logging_type(UDPC_HContext ctx, UDPC_LoggingType loggingType);
2019-06-06 07:02:48 +00:00
UDPC_PacketInfo UDPC_get_received(UDPC_HContext ctx);
2019-06-06 07:02:48 +00:00
2019-09-18 08:35:14 +00:00
const char *UDPC_atostr_cid(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
2019-09-19 03:23:15 +00:00
const char *UDPC_atostr(UDPC_HContext ctx, UDPC_IPV6_ADDR_TYPE addr);
2019-06-06 07:02:48 +00:00
/// addrStr must be a valid ipv6 address or a valid ipv4 address
2019-09-19 03:23:15 +00:00
UDPC_IPV6_ADDR_TYPE UDPC_strtoa(const char *addrStr);
2019-06-06 07:02:48 +00:00
2019-09-19 03:23:15 +00:00
UDPC_IPV6_ADDR_TYPE UDPC_strtoa_link(const char *addrStr, uint32_t *linkId_out);
2019-09-18 08:35:14 +00:00
2019-06-06 07:02:48 +00:00
#ifdef __cplusplus
}
#endif
#endif