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