This commit is contained in:
Nishi 2026-01-30 00:22:34 +09:00
commit 71fdf90267
Signed by: nishi
GPG key ID: 27EF69B208EB9343
5 changed files with 70 additions and 20 deletions

View file

@ -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);

View file

@ -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);

View file

@ -141,6 +141,8 @@ struct _GSNetAddress {
struct _GSBinary {
void* data;
int size;
int flag;
};
struct _GSNetState {

View file

@ -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;

View file

@ -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',