3 #include "../Engine.hh" |
3 #include "../Engine.hh" |
4 |
4 |
5 /* |
5 /* |
6 * NetworkTCPTransport |
6 * NetworkTCPTransport |
7 */ |
7 */ |
8 NetworkTCPTransport::NetworkTCPTransport (NetworkSocket socket) : |
8 NetworkTCPTransport::NetworkTCPTransport (NetworkSocket *socket) : |
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_triggered(), this, &NetworkTCPTransport::on_read); |
12 slots.connect(socket->sig_read(), this, &NetworkTCPTransport::on_read); |
13 slots.connect(socket.sig_write_triggered(), this, &NetworkTCPTransport::on_write); |
13 slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write); |
14 slots.connect(socket.sig_disconnected(), this, &NetworkTCPTransport::on_disconnected); |
|
15 } |
14 } |
16 |
15 |
|
16 NetworkTCPTransport::~NetworkTCPTransport (void) { |
|
17 // release socket |
|
18 delete socket; |
|
19 } |
17 |
20 |
18 void NetworkTCPTransport::on_read (void) { |
21 void NetworkTCPTransport::on_read (void) { |
19 uint32_t length; |
22 uint32_t length; |
20 char *buf_ptr; |
23 char *buf_ptr; |
21 |
24 |
54 Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what(); |
57 Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what(); |
55 |
58 |
56 _sig_disconnect(); |
59 _sig_disconnect(); |
57 } |
60 } |
58 } |
61 } |
59 |
|
60 void NetworkTCPTransport::on_disconnected (void) { |
|
61 // pass right through |
|
62 _sig_disconnect(); |
|
63 } |
|
64 |
62 |
65 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) { |
63 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) { |
66 uint32_t prefix = packet.get_data_size(); |
64 uint32_t prefix = packet.get_data_size(); |
67 |
65 |
68 if (prefix != packet.get_data_size()) |
66 if (prefix != packet.get_data_size()) |
80 // XXX: these are not handled anywhere :( |
78 // XXX: these are not handled anywhere :( |
81 throw; |
79 throw; |
82 } |
80 } |
83 } |
81 } |
84 |
82 |
|
83 /* |
|
84 * NetworkTCPServer |
|
85 */ |
85 NetworkTCPServer::NetworkTCPServer (const NetworkAddress &listen_addr) : |
86 NetworkTCPServer::NetworkTCPServer (const NetworkAddress &listen_addr) : |
86 socket(CL_Socket::tcp, CL_Socket::ipv4) { |
87 socket(AF_UNSPEC, SOCK_STREAM) { |
87 |
|
88 // wow... I didn't know ClanLib was *this* crap |
|
89 socket.proto = CL_Socket::tcp; |
|
90 |
88 |
91 // bind |
89 // bind |
92 socket.bind(listen_addr); |
90 socket.bind(listen_addr); |
93 |
91 |
94 // assign slots |
92 // assign slots |
95 slots.connect(socket.sig_read_triggered(), this, &NetworkTCPServer::on_accept); |
93 slots.connect(socket.sig_read(), this, &NetworkTCPServer::on_accept); |
96 |
94 |
97 // listen |
95 // listen |
98 socket.listen(NETWORK_LISTEN_BACKLOG); |
96 socket.listen(NETWORK_LISTEN_BACKLOG); |
99 |
97 |
100 // use nonblocking sockets |
98 // use nonblocking sockets |
102 } |
100 } |
103 |
101 |
104 |
102 |
105 void NetworkTCPServer::on_accept (void) { |
103 void NetworkTCPServer::on_accept (void) { |
106 // accept a new socket |
104 // accept a new socket |
107 NetworkSocket client_sock = socket.accept(); |
105 NetworkSocket *client_sock = socket.accept(NULL); |
108 |
106 |
109 // create a new NetworkTCPTransport |
107 // create a new NetworkTCPTransport |
110 NetworkTCPTransport *client = buildTransport(client_sock); |
108 NetworkTCPTransport *client = buildTransport(client_sock); |
111 |
109 |
112 // let our user handle it |
110 // let our user handle it |
113 _sig_client(client); |
111 _sig_client(client); |
114 } |
112 } |
115 |
113 |
116 NetworkTCPTransport* NetworkTCPServer::buildTransport (CL_Socket &socket) { |
114 NetworkTCPTransport* NetworkTCPServer::buildTransport (NetworkSocket *socket) { |
117 return new NetworkTCPTransport(socket); |
115 return new NetworkTCPTransport(socket); |
118 } |
116 } |
119 |
117 |
|
118 /* |
|
119 * NetworkTCPClient |
|
120 */ |
120 NetworkTCPClient::NetworkTCPClient (const NetworkAddress &connect_addr) : |
121 NetworkTCPClient::NetworkTCPClient (const NetworkAddress &connect_addr) : |
121 NetworkTCPTransport(NetworkSocket(CL_Socket::tcp, CL_Socket::ipv4)) { |
122 NetworkTCPTransport(new NetworkSocket(AF_UNSPEC, SOCK_STREAM)) { |
122 |
123 |
123 // wow... I didn't know ClanLib was *this* crap |
|
124 socket.proto = CL_Socket::tcp; |
|
125 |
|
126 // connect |
124 // connect |
127 socket.connect(connect_addr); |
125 socket->connect(connect_addr); |
128 |
126 |
129 // use nonblocking sockets |
127 // use nonblocking sockets |
130 socket.set_nonblocking(true); |
128 socket->set_nonblocking(true); |
131 } |
129 } |