2019-01-26 03:52:10 +00:00
|
|
|
#ifndef UDPCONNECTION_H
|
|
|
|
#define UDPCONNECTION_H
|
|
|
|
|
2019-01-26 07:22:31 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <threads.h>
|
2019-01-26 10:11:12 +00:00
|
|
|
#include <time.h>
|
|
|
|
#include <stdint.h>
|
2019-01-26 07:22:31 +00:00
|
|
|
|
2019-01-29 02:53:39 +00:00
|
|
|
#include "UDPC_Defines.h"
|
2019-01-30 06:46:52 +00:00
|
|
|
#include "UDPC_Deque.h"
|
2019-01-26 07:22:31 +00:00
|
|
|
|
2019-01-26 07:49:54 +00:00
|
|
|
#if UDPC_PLATFORM == UDPC_PLATFORM_WINDOWS
|
2019-01-26 07:22:31 +00:00
|
|
|
#include <winsock2.h>
|
|
|
|
|
|
|
|
#define CleanupSocket(x) closesocket(x)
|
2019-01-26 07:49:54 +00:00
|
|
|
#elif UDPC_PLATFORM == UDPC_PLATFORM_MAC || UDPC_PLATFORM == UDPC_PLATFORM_LINUX
|
2019-01-26 07:22:31 +00:00
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
#define CleanupSocket(x) close(x)
|
|
|
|
#endif
|
|
|
|
|
2019-01-30 06:46:52 +00:00
|
|
|
#define UDPC_CD_AMOUNT 32
|
|
|
|
|
2019-01-26 10:11:12 +00:00
|
|
|
// This struct should not be used outside of this library
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
uint32_t addr;
|
|
|
|
uint32_t id;
|
|
|
|
/*
|
|
|
|
* 0x1 - is resending
|
|
|
|
* 0x2 - is not received checked
|
|
|
|
* 0x4 - has been re-sent
|
|
|
|
*/
|
|
|
|
uint32_t flags;
|
|
|
|
char *data;
|
|
|
|
struct timespec sent;
|
|
|
|
} UDPC_INTERNAL_PacketInfo;
|
|
|
|
|
|
|
|
// This struct should not be used outside of this library
|
|
|
|
typedef struct
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* 0x1 - trigger send
|
|
|
|
* 0x2 - is good mode
|
|
|
|
* 0x4 - is good rtt
|
|
|
|
*/
|
|
|
|
uint32_t flags;
|
|
|
|
uint32_t id;
|
|
|
|
uint32_t lseq;
|
|
|
|
uint32_t rseq;
|
|
|
|
uint32_t ack;
|
|
|
|
float timer;
|
|
|
|
float toggleT;
|
|
|
|
float toggleTimer;
|
|
|
|
float toggledTimer;
|
|
|
|
uint16_t port;
|
2019-01-30 06:46:52 +00:00
|
|
|
UDPC_Deque *sentPkts;
|
|
|
|
UDPC_Deque *sendPktQueue;
|
2019-01-26 10:11:12 +00:00
|
|
|
struct timespec received;
|
|
|
|
struct timespec sent;
|
|
|
|
struct timespec rtt;
|
|
|
|
} UDPC_INTERNAL_ConnectionData;
|
|
|
|
|
2019-01-26 07:22:31 +00:00
|
|
|
// This struct should not be modified, only passed to functions that require it
|
|
|
|
typedef struct
|
2019-01-26 03:52:10 +00:00
|
|
|
{
|
2019-01-26 07:22:31 +00:00
|
|
|
/*
|
|
|
|
* 0x1 - is threaded
|
2019-01-30 06:46:52 +00:00
|
|
|
* 0x2 - is client
|
2019-01-26 07:22:31 +00:00
|
|
|
*/
|
2019-01-26 10:11:12 +00:00
|
|
|
uint32_t flags;
|
2019-01-26 07:22:31 +00:00
|
|
|
/*
|
|
|
|
* 0x1 - thread should stop
|
|
|
|
*/
|
2019-01-26 10:11:12 +00:00
|
|
|
uint32_t threadFlags;
|
|
|
|
uint32_t error;
|
|
|
|
int socketHandle;
|
|
|
|
struct sockaddr_in socketInfo;
|
|
|
|
thrd_t threadHandle;
|
|
|
|
mtx_t tCVMtx;
|
|
|
|
mtx_t tflagsMtx;
|
|
|
|
cnd_t threadCV;
|
2019-01-30 06:46:52 +00:00
|
|
|
UDPC_Deque *connected;
|
2019-01-26 07:22:31 +00:00
|
|
|
} UDPC_Context;
|
|
|
|
|
2019-01-30 06:46:52 +00:00
|
|
|
UDPC_Context* UDPC_init(uint16_t listenPort, int isClient);
|
2019-01-26 07:22:31 +00:00
|
|
|
|
2019-01-30 06:46:52 +00:00
|
|
|
UDPC_Context* UDPC_init_threaded_update(uint16_t listenPort, int isClient);
|
2019-01-26 07:22:31 +00:00
|
|
|
|
|
|
|
void UDPC_destroy(UDPC_Context *ctx);
|
|
|
|
|
2019-01-29 02:53:39 +00:00
|
|
|
uint32_t UDPC_get_error(UDPC_Context *ctx);
|
|
|
|
|
|
|
|
const char* UDPC_get_error_str(uint32_t error);
|
|
|
|
|
2019-01-26 07:22:31 +00:00
|
|
|
int UDPC_INTERNAL_threadfn(void *context); // internal usage only
|
2019-01-26 03:52:10 +00:00
|
|
|
|
|
|
|
#endif
|