set UDP sockets as nonblocking
authorterom
Mon, 24 Nov 2008 22:09:29 +0000
changeset 105 91e3f3806b31
parent 104 5cb116dc0759
child 106 731f9dd775d4
set UDP sockets as nonblocking
src/proto2/NetworkUDP.cc
src/proto2/Physics.cc
src/proto2/Physics.hh
--- a/src/proto2/NetworkUDP.cc	Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/NetworkUDP.cc	Mon Nov 24 22:09:29 2008 +0000
@@ -11,6 +11,9 @@
 
     // connect signal
     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+
+    // nonblocking
+    socket.set_nonblocking(true);
 }
 
 NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
@@ -21,6 +24,9 @@
 
     // connect signal
     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
+
+    // nonblocking
+    socket.set_nonblocking(true);
 }
         
 void NetworkUDP::on_recv (void) {
@@ -28,22 +34,26 @@
     NetworkPacket pkt;
     NetworkAddress src;
     
-    // attempt to recv
-    try {
-        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), 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);
 
-    } catch (CL_Error &e) {
-        if (errno == EAGAIN)
-            return;
-        else
-            throw;
-    }
-    
-    // set packet data size
-    pkt.set_data_size(ret);
+        } 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);
+        // handle packet
+        _sig_packet(pkt, src);
+
+    } while (true);
 }
         
 bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
--- a/src/proto2/Physics.cc	Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/Physics.cc	Mon Nov 24 22:09:29 2008 +0000
@@ -8,7 +8,7 @@
 #include <assert.h>
 
 PhysicsWorld::PhysicsWorld (Vector gravity, Vector dimensions)
-    : tick_timer(PHYSICS_TICK_MS), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector<TerrainType>(dimensions.y, DIRT)) {
+    : tick_timer(PHYSICS_TICK_MS), tick_counter(0), gravity(gravity), dimensions(dimensions), terrain(dimensions.x, std::vector<TerrainType>(dimensions.y, DIRT)) {
 
 	generateTerrain(1337);
 
@@ -26,6 +26,12 @@
     for (std::vector<PhysicsObject*>::iterator i = objects.begin(); i != objects.end(); i++) {
         (*i)->tick(); 
     }
+
+    tick_counter++;
+}
+
+uint32_t PhysicsWorld::getTick (void) {
+    return tick_counter;
 }
 
 PhysicsObject::PhysicsObject (PhysicsWorld &world, float mass, Vector position, Vector velocity)
--- a/src/proto2/Physics.hh	Mon Nov 24 22:05:19 2008 +0000
+++ b/src/proto2/Physics.hh	Mon Nov 24 22:09:29 2008 +0000
@@ -26,6 +26,8 @@
     
 private:
     CL_Timer tick_timer;
+
+    uint32_t tick_counter;
     
 protected:
     std::vector<PhysicsObject*> objects;
@@ -45,6 +47,8 @@
     void addObject (PhysicsObject *object);
 
     void tick (void);
+    uint32_t getTick (void);
+
     void generateTerrain (int seed);
     bool collided (Vector oldPos, Vector newPos);