base/packet

This commit is contained in:
Nishi 2026-01-29 15:10:46 +09:00
commit 0286bd63f1
Signed by: nishi
GPG key ID: 27EF69B208EB9343
3 changed files with 25 additions and 3 deletions

View file

@ -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 */

View file

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

View file

@ -3,7 +3,26 @@
#include <GearSrc/Endian.h>
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);
}