bool NetworkBaseUDP::receivePacketFromAddress( SOCKET Socket, NetworkPacket &Packet, sockaddr_in &Address, c8* RecvBuffer, u32 RecvBufferSize) { s32 AddressSize = sizeof(Address); /* Receive network packet from raw address */ s32 Result = recvfrom( Socket, RecvBuffer, RecvBufferSize, 0, (sockaddr*)&Address, &AddressSize ); if (Result == SOCKET_ERROR) { /* Check for error */ #if defined(SP_PLATFORM_WINDOWS) const s32 ErrorCode = WSAGetLastError(); if (ErrorCode != WSAEWOULDBLOCK) io::Log::error("Receiving network packet failed (Error code: " + io::stringc(ErrorCode) + ")"); #endif return false; } /* Copy network packet */ Packet = NetworkPacket(RecvBuffer, Result, 0, true); return true; }
void Network::SendPacket(NetworkPacket packet, const bool reliable) { if(_isConnected) { ENetPacket* enetPacket = enet_packet_create(packet.GetBytes(), packet.GetSize(), reliable); if(!_isServer) enet_peer_send(_peer, 0, enetPacket); else { _mutex.lock(); _receivedPackets.push_back(NetworkPacket(enetPacket,0)); _mutex.unlock(); } } }
void Network::PacketReciever() { while (true) { _mutex.lock(); enet_host_service (Network::GetInstance()->_host, & Network::GetInstance()->_event, 0); switch (Network::GetInstance()->_event.type) { case ENET_EVENT_TYPE_CONNECT: printf ("A new client connected from %x:%u.\n", Network::GetInstance()->_event.peer -> address.host, Network::GetInstance()->_event.peer -> address.port); // Store any relevant client information here. Network::GetInstance()->_event.peer -> data = "Client information"; break; case ENET_EVENT_TYPE_RECEIVE: //printf ("A packet of length %u containing %s was received from %s on channel %u.\n", Network::GetInstance()->_event.packet -> dataLength, Network::GetInstance()->_event.packet -> data, Network::GetInstance()->_event.peer -> data, Network::GetInstance()->_event.channelID; // Add to our list of received packets _receivedPackets.push_back(NetworkPacket(_event.packet, Network::GetInstance()->_event.peer -> address.host)); // Clean up the packet now that we're done using it enet_packet_destroy (_event.packet); break; case ENET_EVENT_TYPE_DISCONNECT: printf ("%s disconected.\n", _event.peer -> data); // Reset the peer's client information. Network::GetInstance()->_event.peer -> data = NULL; } _mutex.unlock(); } }