--- a/src/Network/UDP.cc Mon Dec 15 16:41:00 2008 +0000
+++ b/src/Network/UDP.cc Mon Dec 15 23:56:42 2008 +0000
@@ -1,52 +1,49 @@
#include "UDP.hh"
+#include "../Engine.hh"
#include <ClanLib/core.h>
#include <cassert>
NetworkUDP::NetworkUDP (void) :
- socket(CL_Socket::udp, CL_Socket::ipv4) {
-
+ socket(AF_UNSPEC, SOCK_DGRAM)
+{
// do not bind
// connect signal
- slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+ slots.connect(socket.sig_read(), this, &NetworkUDP::on_recv);
// nonblocking
socket.set_nonblocking(true);
}
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
- socket(CL_Socket::udp, CL_Socket::ipv4) {
+ socket(AF_UNSPEC, SOCK_DGRAM) {
// bind socket
socket.bind(bind_addr);
// connect signal
- slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+ slots.connect(socket.sig_read(), this, &NetworkUDP::on_recv);
// nonblocking
socket.set_nonblocking(true);
}
void NetworkUDP::on_recv (void) {
- int ret;
+ size_t ret;
NetworkPacket pkt;
NetworkAddress src;
// receieve as many packets as possible
do {
// attempt to recv a packet
- try {
- ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
+ ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), &src);
+
+ // no more packets?
+ if (ret == 0)
+ return;
- } catch (CL_Error &e) {
- if (errno == EAGAIN)
- return;
- else
- throw;
- }
-
// set packet data size
pkt.set_data_size(ret);
@@ -57,23 +54,26 @@
}
bool NetworkUDP::sendto (const NetworkPacketBuffer &packet, const NetworkAddress &dst) {
- int ret;
+ size_t ret;
- // XXX: shouldn't get trimmed
try {
- ret = socket.send(packet.get_buf(), packet.get_data_size(), dst);
+ // try and send
+ ret = socket.send(packet.get_buf(), packet.get_data_size(), &dst);
- } catch (CL_Error &e) {
- // XXX: catch some errors, but not others?
+ } catch (NetworkSocketError &e) {
+ // catch and log errors
+ Engine::log(WARN, "udp.sendto") << "socket->send raised error: " << e.what();
return false;
}
-
- assert(ret > 0);
- // UDP shouldn't trim packets
- assert((unsigned int) ret == packet.get_data_size());
-
- // good
- return true;
+ // weird packet size?
+ if (ret != packet.get_data_size()) {
+ Engine::log(ERROR, "udp.sendto") << "socket->send returned weird length: " << ret << ", packet was " << packet.get_data_size();
+ return false;
+
+ } else {
+ // sent
+ return true;
+ }
}