terom@89: terom@89: #include "NetworkUDP.hh" terom@89: terom@89: #include terom@89: #include terom@89: terom@89: NetworkUDP::NetworkUDP (void) : terom@89: socket(CL_Socket::udp, CL_Socket::ipv4) { terom@89: terom@89: // do not bind terom@89: terom@89: // connect signal terom@89: slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv); terom@89: } terom@89: terom@89: NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) : terom@89: socket(CL_Socket::udp, CL_Socket::ipv4) { terom@89: terom@89: // bind socket terom@89: socket.bind(bind_addr); terom@89: terom@89: // connect signal terom@89: slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv); terom@89: } terom@89: terom@89: void NetworkUDP::on_recv (void) { terom@89: int ret; terom@89: NetworkPacket pkt; terom@89: NetworkAddress src; terom@89: terom@89: // attempt to recv terom@89: try { terom@89: ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src); terom@89: terom@89: } catch (CL_Error &e) { terom@89: if (errno == EAGAIN) terom@89: return; terom@89: else terom@89: throw; terom@89: } terom@89: terom@89: // set packet data size terom@89: pkt.set_data_size(ret); terom@89: terom@89: // handle packet terom@89: _sig_packet(pkt, src); terom@89: } terom@89: terom@89: bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) { terom@89: int ret; terom@89: terom@89: // XXX: shouldn't get trimmed terom@89: try { terom@89: ret = socket.send(packet.get_buf(), packet.get_data_size(), dst); terom@89: terom@89: } catch (CL_Error &e) { terom@89: // XXX: catch some errors, but not others? terom@89: return false; terom@89: } terom@89: terom@89: assert(ret > 0); terom@89: terom@89: // UDP shouldn't trim packets terom@89: assert((unsigned int) ret == packet.get_data_size()); terom@89: terom@89: // good terom@89: return true; terom@89: } terom@89: