9 socket(socket), in(socket, NETWORK_TCP_INITIAL_IN_BUF), out(socket, NETWORK_TCP_INITIAL_OUT_BUF) { |
9 socket(socket), in(socket, NETWORK_TCP_INITIAL_IN_BUF), out(socket, NETWORK_TCP_INITIAL_OUT_BUF) { |
10 |
10 |
11 // connect signals |
11 // connect signals |
12 slots.connect(socket->sig_read(), this, &NetworkTCPTransport::on_read); |
12 slots.connect(socket->sig_read(), this, &NetworkTCPTransport::on_read); |
13 slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write); |
13 slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write); |
|
14 |
|
15 // activate read polling, but leave write polling for later |
|
16 socket->set_poll_read(true); |
14 } |
17 } |
15 |
18 |
16 NetworkTCPTransport::~NetworkTCPTransport (void) { |
19 NetworkTCPTransport::~NetworkTCPTransport (void) { |
17 // release socket |
20 // release socket |
18 delete socket; |
21 delete socket; |
41 |
44 |
42 } catch (NetworkSocketError &e) { |
45 } catch (NetworkSocketError &e) { |
43 // log and disconnect |
46 // log and disconnect |
44 Engine::log(ERROR, "tcp.on_read") << "socket error: " << e.what(); |
47 Engine::log(ERROR, "tcp.on_read") << "socket error: " << e.what(); |
45 |
48 |
46 _sig_disconnect(); |
49 handle_disconnect(); |
47 } |
50 } |
48 } |
51 } |
49 |
52 |
50 void NetworkTCPTransport::on_write (void) { |
53 void NetworkTCPTransport::on_write (void) { |
51 try { |
54 try { |
52 // just flush the output buffer |
55 // just flush the output buffer, and deactivate output polling if done |
53 out.flush_write(); |
56 if (!out.flush_write()) |
|
57 socket->set_poll_write(false); |
54 |
58 |
55 } catch (NetworkSocketError &e) { |
59 } catch (NetworkSocketError &e) { |
56 // log and disconnect |
60 // log and disconnect |
57 Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what(); |
61 Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what(); |
58 |
62 |
59 _sig_disconnect(); |
63 handle_disconnect(); |
60 } |
64 } |
61 } |
65 } |
62 |
66 |
63 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) { |
67 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) { |
64 uint32_t prefix = packet.get_data_size(); |
68 uint32_t prefix = packet.get_data_size(); |
65 |
69 |
66 if (prefix != packet.get_data_size()) |
70 if (prefix != packet.get_data_size()) |
67 throw CL_Error("send prefix overflow"); |
71 throw CL_Error("send prefix overflow"); |
68 |
72 |
69 try { |
73 try { |
70 // just write to the output buffer |
74 // just write to the output buffer, but activate output polling if needed |
71 out.write_prefix((char *) packet.get_buf(), prefix); |
75 if (out.write_prefix((char *) packet.get_buf(), prefix)) |
|
76 socket->set_poll_write(true); |
72 |
77 |
73 } catch (NetworkSocketError &e) { |
78 } catch (NetworkSocketError &e) { |
74 const char *err = e.what(); |
79 const char *err = e.what(); |
75 |
80 |
76 Engine::log(ERROR, "tcp.write_packet") << err; |
81 Engine::log(ERROR, "tcp.write_packet") << err; |
77 |
82 |
78 // XXX: these are not handled anywhere :( |
83 // XXX: these are not handled anywhere :( |
79 throw; |
84 throw; |
80 } |
85 } |
|
86 } |
|
87 |
|
88 void NetworkTCPTransport::handle_disconnect (void) { |
|
89 // disable events on our socket |
|
90 socket->set_poll_read(false); |
|
91 socket->set_poll_write(false); |
|
92 |
|
93 // signal |
|
94 _sig_disconnect(); |
81 } |
95 } |
82 |
96 |
83 /* |
97 /* |
84 * NetworkTCPServer |
98 * NetworkTCPServer |
85 */ |
99 */ |
95 // listen |
109 // listen |
96 socket.listen(NETWORK_LISTEN_BACKLOG); |
110 socket.listen(NETWORK_LISTEN_BACKLOG); |
97 |
111 |
98 // use nonblocking sockets |
112 // use nonblocking sockets |
99 socket.set_nonblocking(true); |
113 socket.set_nonblocking(true); |
|
114 |
|
115 // activate polling |
|
116 socket.set_poll_read(true); |
100 } |
117 } |
101 |
|
102 |
118 |
103 void NetworkTCPServer::on_accept (void) { |
119 void NetworkTCPServer::on_accept (void) { |
104 // accept a new socket |
120 // accept a new socket |
105 NetworkSocket *client_sock = socket.accept(NULL); |
121 NetworkSocket *client_sock = socket.accept(NULL); |
106 |
122 |