src/proto2/NetworkUDP.cc
changeset 105 91e3f3806b31
parent 89 825c4613e087
equal deleted inserted replaced
104:5cb116dc0759 105:91e3f3806b31
     9     
     9     
    10     // do not bind
    10     // do not bind
    11 
    11 
    12     // connect signal
    12     // connect signal
    13     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
    13     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
       
    14 
       
    15     // nonblocking
       
    16     socket.set_nonblocking(true);
    14 }
    17 }
    15 
    18 
    16 NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
    19 NetworkUDP::NetworkUDP (const NetworkAddress &bind_addr) :
    17     socket(CL_Socket::udp, CL_Socket::ipv4) {
    20     socket(CL_Socket::udp, CL_Socket::ipv4) {
    18     
    21     
    19     // bind socket
    22     // bind socket
    20     socket.bind(bind_addr);
    23     socket.bind(bind_addr);
    21 
    24 
    22     // connect signal
    25     // connect signal
    23     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
    26     slots.connect(socket.sig_read_triggered(), this, &NetworkUDP::on_recv);
       
    27 
       
    28     // nonblocking
       
    29     socket.set_nonblocking(true);
    24 }
    30 }
    25         
    31         
    26 void NetworkUDP::on_recv (void) {
    32 void NetworkUDP::on_recv (void) {
    27     int ret;
    33     int ret;
    28     NetworkPacket pkt;
    34     NetworkPacket pkt;
    29     NetworkAddress src;
    35     NetworkAddress src;
    30     
    36     
    31     // attempt to recv
    37     // receieve as many packets as possible
    32     try {
    38     do {    
    33         ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
    39         // attempt to recv a packet
       
    40         try {
       
    41             ret = socket.recv(pkt.get_buf(), pkt.get_buf_size(), src);
    34 
    42 
    35     } catch (CL_Error &e) {
    43         } catch (CL_Error &e) {
    36         if (errno == EAGAIN)
    44             if (errno == EAGAIN)
    37             return;
    45                 return;
    38         else
    46             else
    39             throw;
    47                 throw;
    40     }
    48         }
    41     
    49         
    42     // set packet data size
    50         // set packet data size
    43     pkt.set_data_size(ret);
    51         pkt.set_data_size(ret);
    44 
    52 
    45     // handle packet
    53         // handle packet
    46     _sig_packet(pkt, src);
    54         _sig_packet(pkt, src);
       
    55 
       
    56     } while (true);
    47 }
    57 }
    48         
    58         
    49 bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
    59 bool NetworkUDP::sendto (const NetworkPacket &packet, const NetworkAddress &dst) {
    50     int ret;
    60     int ret;
    51 
    61