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