wip
This commit is contained in:
parent
3cf773cbd9
commit
71fdf90267
5 changed files with 70 additions and 20 deletions
|
|
@ -8,10 +8,28 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* 6 bits reserved
|
||||
* 1 bit unsafe or safe
|
||||
* 1 bit ack or normal
|
||||
* 4 bytes index
|
||||
* 4 bytes sequence
|
||||
*
|
||||
* if unsafe:
|
||||
* n bytes data
|
||||
* else if ack:
|
||||
* no data continues
|
||||
* else if sequence is 0:
|
||||
* 4 bytes sequence count
|
||||
* else:
|
||||
* n bytes data
|
||||
*/
|
||||
|
||||
#define GSNetDefaultPort 23903
|
||||
#define GSNetAcknowledgeTimeout 500
|
||||
|
||||
#define GSNetPacketFlagAcknowledge (1 << 0)
|
||||
#define GSNetPacketFlagUnsafe (1 << 1)
|
||||
|
||||
/* net_client.c */
|
||||
GSDECL GSNetClient GSNetClientOpen(GSClient net, const char* hostname, int port);
|
||||
|
|
|
|||
|
|
@ -8,6 +8,25 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* signature: 0x7F PAK
|
||||
*
|
||||
* entry:
|
||||
* 1 byte: type
|
||||
* 4 bytes: name crc32
|
||||
* 1 byte: name len
|
||||
* n bytes: name
|
||||
* if file {
|
||||
* 4 bytes: actual size
|
||||
* 4 bytes: compressed size
|
||||
* 4 bytes: seek pos
|
||||
* } else {
|
||||
* 2 bytes: number of entries
|
||||
* 4 bytes: total size
|
||||
* n bytes: entries
|
||||
* }
|
||||
*/
|
||||
|
||||
GSDECL GSResource GSResourceOpen(GSEngine engine, const char* path);
|
||||
GSDECL void* GSResourceGet(GSResource resource, const char* name, unsigned int* size);
|
||||
GSDECL void GSResourceClose(GSResource resource);
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ struct _GSNetAddress {
|
|||
struct _GSBinary {
|
||||
void* data;
|
||||
int size;
|
||||
|
||||
int flag;
|
||||
};
|
||||
|
||||
struct _GSNetState {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,16 @@ enum states {
|
|||
};
|
||||
|
||||
void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GSNetAddress* address) {
|
||||
if(packet->header.flag & GSNetPacketFlagAcknowledge) {
|
||||
if(packet->header.flag & GSNetPacketFlagUnsafe) {
|
||||
GSBinary binary;
|
||||
|
||||
binary.size = 508 - sizeof(packet->header);
|
||||
binary.data = malloc(binary.size);
|
||||
|
||||
memcpy(binary.data, packet->data, binary.size);
|
||||
|
||||
arrput(state->rx, binary);
|
||||
} else if(packet->header.flag & GSNetPacketFlagAcknowledge) {
|
||||
if(arrlen(state->tx) > 0 && state->txstate == WaitingAcknowledge && state->txindex == packet->header.index && state->txseq == packet->header.seq) {
|
||||
GSLog(state->engine, GSLogDebug, "%s: Received acknowledge packet %d:%d", state->name, state->txindex, state->txseq);
|
||||
|
||||
|
|
@ -33,6 +42,8 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
|||
state->rxtotal = GSEndianSwapU32BE(*(GSU32*)packet->data);
|
||||
}
|
||||
|
||||
/* TODO: buffer what it got */
|
||||
|
||||
state->rxseq++;
|
||||
if(state->rxseq == (state->rxtotal + 1)) {
|
||||
state->rxseq = 0;
|
||||
|
|
@ -54,6 +65,25 @@ void GSNetStateRead(GSNetState* state, GSNetSocket sock, GSNetPacket* packet, GS
|
|||
|
||||
void GSNetStateWrite(GSNetState* state, GSNetSocket sock, GSNetAddress* address) {
|
||||
if(arrlen(state->tx) > 0) {
|
||||
int i;
|
||||
for(i = 0; i < arrlen(state->tx); i++) {
|
||||
if(state->tx[i].flag & GSNetPacketFlagUnsafe) {
|
||||
GSNetPacket pkt;
|
||||
|
||||
pkt.header.flag = GSNetPacketFlagUnsafe;
|
||||
pkt.header.index = 0;
|
||||
pkt.header.seq = 0;
|
||||
pkt.size = state->tx[i].size;
|
||||
|
||||
memcpy(pkt.data, state->tx[i].data, pkt.size);
|
||||
|
||||
GSNetPacketWrite(sock, &pkt, address);
|
||||
|
||||
arrdel(state->tx, i);
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
if(state->txstate == Acknowledged) {
|
||||
int n = state->tx[0].size;
|
||||
GSNetPacket pkt;
|
||||
|
|
|
|||
|
|
@ -8,25 +8,6 @@
|
|||
|
||||
#include <lz4.h>
|
||||
|
||||
/**
|
||||
* signature: 0x7F PAK
|
||||
*
|
||||
* entry:
|
||||
* 1 byte: type
|
||||
* 4 bytes: name crc32
|
||||
* 1 byte: name len
|
||||
* n bytes: name
|
||||
* if file {
|
||||
* 4 bytes: actual size
|
||||
* 4 bytes: compressed size
|
||||
* 4 bytes: seek pos
|
||||
* } else {
|
||||
* 2 bytes: number of entries
|
||||
* 4 bytes: total size
|
||||
* n bytes: entries
|
||||
* }
|
||||
*/
|
||||
|
||||
static unsigned char res_sig[4] = {
|
||||
0x7f,
|
||||
'P',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue