| 166 | */ |
| 167 | |
| 168 | bool UdpSocket::ReceivePacket(NetPacket* packet, IpAddress* from) |
| 169 | { |
| 170 | NazaraAssert(packet, "Invalid packet"); |
| 171 | |
| 172 | // I'm not sure what's the best between having a 65k bytes buffer ready for any datagram size |
| 173 | // or querying the next datagram size every time, for now I'll leave it as is |
| 174 | packet->Reset(NetCode_Invalid, std::numeric_limits<UInt16>::max()); |
| 175 | packet->Resize(std::numeric_limits<UInt16>::max()); |
| 176 | |
| 177 | std::size_t received; |
| 178 | if (!Receive(packet->GetData(), static_cast<std::size_t>(packet->GetSize()), from, &received)) |
| 179 | return false; |
| 180 | |
| 181 | if (received == 0) |
| 182 | return false; //< No datagram received |
| 183 | |
| 184 | Nz::UInt16 netCode; |
| 185 | Nz::UInt16 packetSize; |
| 186 | if (!NetPacket::DecodeHeader(packet->GetConstData(), &packetSize, &netCode)) |
| 187 | { |
| 188 | m_lastError = SocketError_Packet; |
| 189 | NazaraWarning("Invalid header data"); |
| 190 | return false; |
| 191 | } |
| 192 | |
| 193 | if (packetSize != received) |
| 194 | { |
| 195 | m_lastError = SocketError_Packet; |
| 196 | NazaraWarning("Invalid packet size (packet size is " + String::Number(packetSize) + " bytes, received " + Nz::String::Number(received) + " bytes)"); |
| 197 | return false; |
| 198 | } |
| 199 | |
| 200 | packet->Resize(received); |
| 201 | packet->SetNetCode(netCode); |
| 202 | return true; |
| 203 | } |
| 204 | |
| 205 | /*! |
| 206 | * \brief Sends the data available |