src/proto2/NetworkUDP.cc
author terom
Thu, 20 Nov 2008 23:45:33 +0000
branchno-netsession
changeset 41 ca80cd67785d
parent 39 cfb8b6e2a35f
permissions -rw-r--r--
merge r64 through r88 from trunk
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
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
     4
#include <ClanLib/core.h>
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
     5
#include <cassert>
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
     6
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     7
NetworkUDP::NetworkUDP (void) : 
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
     8
    socket(CL_Socket::udp, CL_Socket::ipv4) {
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
     9
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    10
    // do not bind
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    11
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    12
    // connect signal
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    13
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    14
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    15
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    16
NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    17
    socket(CL_Socket::udp, CL_Socket::ipv4) {
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    18
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    19
    // bind socket
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    20
    socket.bind(bind_addr);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    21
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    22
    // connect signal
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    23
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    24
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    25
        
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    26
void NetworkUDP::on_recv (void) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    27
    int ret;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    28
    NetworkPacket pkt;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    29
    NetworkAddress src;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    30
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    31
    // attempt to recv
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    32
    try {
39
cfb8b6e2a35f almost playable
terom
parents: 37
diff changeset
    33
        ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    34
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    35
    } catch (CL_Error &e) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    36
        if (errno == EAGAIN)
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    37
            return;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    38
        else
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    39
            throw;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    40
    }
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    41
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    42
    // set packet data size
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    43
    pkt.set_data_size(ret);
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    44
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    45
    // handle packet
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    46
    _sig_packet(pkt, src);
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    47
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    48
        
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    49
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    50
    int ret;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    51
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    52
    // XXX: shouldn't get trimmed
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    53
    try {
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    54
        ret = socket.send(packet.get_buf(), packet.get_data_size(), dst);
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    55
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    56
    } catch (CL_Error &e) {
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    57
        // XXX: catch some errors, but not others?
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    58
        return false;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    59
    }
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    60
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    61
    assert(ret > 0);
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    62
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    63
    // UDP shouldn't trim packets
37
ed2957490bbf compile step complete
terom
parents: 33
diff changeset
    64
    assert((unsigned int) ret == packet.get_data_size());
33
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    65
    
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    66
    // good
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    67
    return true;
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    68
}
e53f09b378f4 more untested, uncompiled code
terom
parents:
diff changeset
    69