From 0286bd63f138bf92f7cd2a954eef325c9de9bbc9 Mon Sep 17 00:00:00 2001 From: NishiOwO Date: Thu, 29 Jan 2026 15:10:46 +0900 Subject: [PATCH] base/packet --- engine/include/GearSrc/Net.h | 2 +- engine/src/net/net_base.c | 7 +++++-- engine/src/net/net_packet.c | 19 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/engine/include/GearSrc/Net.h b/engine/include/GearSrc/Net.h index ad172d5..683c6bb 100644 --- a/engine/include/GearSrc/Net.h +++ b/engine/include/GearSrc/Net.h @@ -21,7 +21,7 @@ GSDECL GSBool GSNetBaseHasData(int fd); GSDECL int GSNetBaseServer(int port); GSDECL int GSNetBaseClient(const char* hostname, int port); GSDECL void GSNetBaseClose(int fd); -GSDECL void GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */ +GSDECL int GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address); /* always read 508 bytes! */ GSDECL void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address); /* net_packet.c */ diff --git a/engine/src/net/net_base.c b/engine/src/net/net_base.c index 0b55d09..d438f68 100644 --- a/engine/src/net/net_base.c +++ b/engine/src/net/net_base.c @@ -89,14 +89,17 @@ void GSNetBaseClose(int fd) { #endif } -void GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address) { +int GSNetBaseRead(int fd, void* data, int size, GSNetAddress* address) { struct sockaddr_in addr; int len = sizeof(addr); + int n; - recvfrom(fd, data, size, 0, (struct sockaddr*)&addr, &len); + n = recvfrom(fd, data, size, 0, (struct sockaddr*)&addr, &len); address->address = addr.sin_addr.s_addr; address->port = addr.sin_port; + + return n; } void GSNetBaseWrite(int fd, void* data, int size, GSNetAddress* address) { diff --git a/engine/src/net/net_packet.c b/engine/src/net/net_packet.c index cb4c4f4..db13b49 100644 --- a/engine/src/net/net_packet.c +++ b/engine/src/net/net_packet.c @@ -3,7 +3,26 @@ #include void GSNetPacketRead(int fd, GSNetPacket* packet, GSNetAddress* address) { + unsigned char buf[508]; + + packet->size = GSNetBaseRead(fd, buf, 508, address) - sizeof(packet->header); + + memcpy(&packet->header, buf, sizeof(packet->header)); + memcpy(packet->data, buf + sizeof(packet->header), packet->size); + + packet->header.index = GSEndianSwapU32BE(packet->header.index); + packet->header.sequence = GSEndianSwapU32BE(packet->header.sequence); } void GSNetPacketWrite(int fd, GSNetPacket* packet, GSNetAddress* address) { + GSNetPacketHeader header = packet->header; + unsigned char buf[508]; + + header.index = GSEndianSwapU32BE(header.index); + header.sequence = GSEndianSwapU32BE(header.sequence); + + memcpy(buf, &header, sizeof(header)); + memcpy(buf + sizeof(header), packet->data, packet->size); + + GSNetBaseWrite(fd, buf, sizeof(header) + packet->size, address); }