src/proto2/NetworkUDP.cc
author terom
Thu, 20 Nov 2008 23:51:46 +0000
changeset 89 825c4613e087
child 105 91e3f3806b31
permissions -rw-r--r--
merge branches/no-netsession@89 into trunk
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);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    14
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    15
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    16
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    17
    socket(CL_Socket::udp, CL_Socket::ipv4) {
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
    // bind socket
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    20
    socket.bind(bind_addr);
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
    // connect signal
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    23
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
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
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    26
void NetworkUDP::on_recv (void) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    27
    int ret;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    28
    NetworkPacket pkt;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    29
    NetworkAddress src;
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
    // attempt to recv
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    32
    try {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    33
        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    34
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    35
    } catch (CL_Error &e) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    36
        if (errno == EAGAIN)
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    37
            return;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    38
        else
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    39
            throw;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    40
    }
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    41
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    42
    // set packet data size
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    43
    pkt.set_data_size(ret);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    44
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    45
    // handle packet
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    46
    _sig_packet(pkt, src);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    47
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    48
        
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    49
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    50
    int ret;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    51
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    52
    // XXX: shouldn't get trimmed
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    53
    try {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    54
        ret = socket.send(packet.get_buf(), packet.get_data_size(), dst);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    55
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    56
    } catch (CL_Error &e) {
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    57
        // XXX: catch some errors, but not others?
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    58
        return false;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    59
    }
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    60
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    61
    assert(ret > 0);
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    62
    
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    63
    // UDP shouldn't trim packets
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    64
    assert((unsigned int) ret == packet.get_data_size());
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
    // good
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    67
    return true;
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    68
}
825c4613e087 merge branches/no-netsession@89 into trunk
terom
parents:
diff changeset
    69