src/proto2/NetworkUDP.cc
author terom
Mon, 10 Nov 2008 19:57:57 +0000
branchno-netsession
changeset 33 e53f09b378f4
child 37 ed2957490bbf
permissions -rw-r--r--
more untested, uncompiled code
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     1
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     2
#include "NetworkUDP.hh"
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     3
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     4
NetworkUDP::NetworkUDP (void) : 
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     5
    socket(udp, ipv4) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     6
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     7
    // do not bind
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     8
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     9
    // connect signal
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    10
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    11
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    12
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    13
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    14
    socket(udp, ipv4) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    15
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    16
    // bind socket
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    17
    socket.bind(bind_addr);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    18
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    19
    // connect signal
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    20
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    21
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    22
        
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    23
void NetworkUDP::on_recv (void) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    24
    int ret;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    25
    NetworkPacket pkt;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    26
    NetworkAddress src;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    27
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    28
    // attempt to recv
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    29
    try {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    30
        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size());
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    31
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    32
    } catch (CL_Error &e) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    33
        if (errno == EAGAIN)
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    34
            return;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    35
        else
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    36
            throw;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    37
    }
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    38
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    39
    // set packet data size
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    40
    pkt.set_data_size(ret);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    41
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    42
    // handle packet
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    43
    sig_packet(pkt, src);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    44
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    45
        
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    46
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    47
    int ret;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    48
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    49
    // XXX: shouldn't get trimmed
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    50
    try {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    51
        ret =socket.send(packet.get_buf(), packet.get_data_size(), dst);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    52
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    53
    } catch (CL_Error &e) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    54
        // XXX: catch some errors, but not others?
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    55
        return false;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    56
    }
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    57
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    58
    // UDP shouldn't trim packets
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    59
    assert(ret == packet.get_data_size());
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    60
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    61
    // good
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    62
    return true;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    63
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    64