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