Fix UDPC_destroy, WIP impl of recieving packets

This commit is contained in:
Stephen Seo 2019-02-04 15:33:44 +09:00
parent f0e82c7488
commit 884a262f93
3 changed files with 73 additions and 1 deletions

View file

@ -47,4 +47,6 @@ static const char *UDPC_ERR_THREADFAIL_STR = "Failed to create thread";
#define UDPC_SENT_PKTS_MAX_SIZE 34
#define UDPC_SENT_PKTS_ALLOC_SIZE 35
#define UDPC_PACKET_MAX_SIZE 8192
#endif

View file

@ -133,6 +133,31 @@ UDPC_Context* UDPC_init_threaded_update(uint16_t listenPort, int isClient)
void UDPC_destroy(UDPC_Context *ctx)
{
CleanupSocket(ctx->socketHandle);
for(int x = 0; x * sizeof(UDPC_INTERNAL_ConnectionData) < ctx->connected->size; ++x)
{
UDPC_INTERNAL_ConnectionData *cd = UDPC_Deque_index_ptr(
ctx->connected, sizeof(UDPC_INTERNAL_ConnectionData), x);
for(int y = 0; y * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sentPkts->size; ++y)
{
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
cd->sentPkts, sizeof(UDPC_INTERNAL_PacketInfo), y);
if(pinfo->data)
{
free(pinfo->data);
}
}
UDPC_Deque_destroy(cd->sentPkts);
for(int y = 0; y * sizeof(UDPC_INTERNAL_PacketInfo) < cd->sendPktQueue->size; ++y)
{
UDPC_INTERNAL_PacketInfo *pinfo = UDPC_Deque_index_ptr(
cd->sendPktQueue, sizeof(UDPC_INTERNAL_PacketInfo), y);
if(pinfo->data)
{
free(pinfo->data);
}
}
UDPC_Deque_destroy(cd->sendPktQueue);
}
UDPC_Deque_destroy(ctx->connected);
if((ctx->flags & 0x1) != 0)
@ -424,7 +449,50 @@ void UDPC_update(UDPC_Context *ctx)
}
// receive packet
// TODO
#if UDPC_PLATFORM == UDPC_PLATFORM_WINDOWS
typedef int socklen_t;
#endif
struct sockaddr_in receivedData;
socklen_t receivedDataSize = sizeof(receivedData);
int bytes = recvfrom(
ctx->socketHandle,
ctx->recvBuf,
UDPC_PACKET_MAX_SIZE,
0,
(struct sockaddr*) &receivedData,
&receivedDataSize);
if(bytes < 20)
{
UDPC_INTERNAL_log(ctx, 2, "Got invalid packet from %s port %d (too small)",
UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr),
ntohs(receivedData.sin_port));
return;
}
uint32_t temp = ntohl(*((uint32_t*)ctx->recvBuf));
if(temp != UDPC_PKT_PROTOCOL_ID)
{
UDPC_INTERNAL_log(ctx, 2, "Got invalid packet from %s port %d (invalid protocol id)",
UDPC_INTERNAL_atostr(ctx, receivedData.sin_addr.s_addr),
ntohs(receivedData.sin_port));
return;
}
uint32_t conID = ntohl(*((uint32_t*)(ctx->recvBuf + 4)));
uint32_t seqID = ntohl(*((uint32_t*)(ctx->recvBuf + 8)));
uint32_t rseq = ntohl(*((uint32_t*)(ctx->recvBuf + 12)));
uint32_t ack = ntohl(*((uint32_t*)(ctx->recvBuf + 16)));
int isConnect = conID & UDPC_ID_CONNECT;
int isPing = conID & UDPC_ID_PING;
int isNotRecvCheck = conID & UDPC_ID_NO_REC_CHK;
int isResent = conID & UDPC_ID_RESENDING;
conID &= 0x0FFFFFFF;
if(isConnect != 0 && (ctx->flags & 0x40) != 0)
{
// TODO after impl hash map of connected
}
}
float UDPC_ts_diff_to_seconds(struct timespec *ts0, struct timespec *ts1)

View file

@ -78,6 +78,7 @@ typedef struct
* 0x8 - log warnings
* 0x10 - log info
* 0x20 - log verbose
* 0x40 - accept new connections
*/
uint32_t flags;
/*
@ -94,6 +95,7 @@ typedef struct
UDPC_Deque *connected;
struct timespec lastUpdated;
char atostrBuf[UDPC_ATOSTR_BUF_SIZE];
char recvBuf[UDPC_PACKET_MAX_SIZE];
} UDPC_Context;
UDPC_Context* UDPC_init(uint16_t listenPort, int isClient);