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 |