src/proto2/NetworkUDP.cc
author saiam
Fri, 28 Nov 2008 15:27:51 +0000
changeset 122 16a73ebca810
parent 105 91e3f3806b31
permissions -rw-r--r--
No warnings anymore, but well have to think about that applyForce
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     1
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     2
#include "NetworkUDP.hh"
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     3
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     4
#include <ClanLib/core.h>
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     5
#include <cassert>
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     6
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     7
NetworkUDP::NetworkUDP (void) : 
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     8
    socket(CL_Socket::udp, CL_Socket::ipv4) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
     9
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    10
    // do not bind
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    11
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    12
    // connect signal
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    13
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
105
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    14
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    15
    // nonblocking
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    16
    socket.set_nonblocking(true);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    17
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    18
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    19
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    20
    socket(CL_Socket::udp, CL_Socket::ipv4) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    21
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    22
    // bind socket
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    23
    socket.bind(bind_addr);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    24
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    25
    // connect signal
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    26
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
105
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    27
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    28
    // nonblocking
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    29
    socket.set_nonblocking(true);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    30
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    31
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    32
void NetworkUDP::on_recv (void) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    33
    int ret;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    34
    NetworkPacket pkt;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    35
    NetworkAddress src;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    36
    
105
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    37
    // receieve as many packets as possible
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    38
    do {    
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    39
        // attempt to recv a packet
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    40
        try {
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    41
            ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    42
105
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    43
        } catch (CL_Error &e) {
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    44
            if (errno == EAGAIN)
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    45
                return;
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    46
            else
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    47
                throw;
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    48
        }
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    49
        
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    50
        // set packet data size
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    51
        pkt.set_data_size(ret);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    52
105
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    53
        // handle packet
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    54
        _sig_packet(pkt, src);
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    55
91e3f3806b31 set UDP sockets as nonblocking
terom
parents: 89
diff changeset
    56
    } while (true);
89
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    57
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    58
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    59
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    60
    int ret;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    61
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    62
    // XXX: shouldn't get trimmed
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    63
    try {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    64
        ret = socket.send(packet.get_buf(), packet.get_data_size(), dst);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    65
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    66
    } catch (CL_Error &e) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    67
        // XXX: catch some errors, but not others?
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    68
        return false;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    69
    }
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    70
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    71
    assert(ret > 0);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    72
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    73
    // UDP shouldn't trim packets
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    74
    assert((unsigned int) ret == packet.get_data_size());
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    75
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    76
    // good
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    77
    return true;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    78
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    79