src/proto2/NetworkUDP.cc
author terom
Thu, 20 Nov 2008 22:55:28 +0000
branchno-netsession
changeset 39 cfb8b6e2a35f
parent 37 ed2957490bbf
permissions -rw-r--r--
almost playable

#include "NetworkUDP.hh"

#include <ClanLib/core.h>
#include <cassert>

NetworkUDP::NetworkUDP (void) : 
    socket(CL_Socket::udp, CL_Socket::ipv4) {
    
    // do not bind

    // connect signal
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
}

NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
    socket(CL_Socket::udp, CL_Socket::ipv4) {
    
    // bind socket
    socket.bind(bind_addr);

    // connect signal
    slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
}
        
void NetworkUDP::on_recv (void) {
    int ret;
    NetworkPacket pkt;
    NetworkAddress src;
    
    // attempt to recv
    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);

    // handle packet
    _sig_packet(pkt, src);
}
        
bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
    int ret;

    // XXX: shouldn't get trimmed
    try {
        ret = socket.send(packet.get_buf(), packet.get_data_size(), dst);

    } catch (CL_Error &e) {
        // XXX: catch some errors, but not others?
        return false;
    }

    assert(ret > 0);
    
    // UDP shouldn't trim packets
    assert((unsigned int) ret == packet.get_data_size());
    
    // good
    return true;
}