src/Network/UDP.cc
changeset 378 5589abf5e61b
parent 202 b3f5d766391e
child 380 d193dd1d8a7e
--- 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;
+    }
 }