net: socket system, high level api
[quarnos.git] / resources / net / udp_remote_client_socket.h
blobfe6a8f5c8d668103dc68ae5f81af16e5467be9e5
1 #include "udp_server_socket.h"
2 #include "client_socket.h"
3 #include "libs/fifo.h"
4 #include "libs/buffer.h"
6 namespace net {
7 class udp_remote_client_socket : public remote_client_socket {
8 private:
9 int server_port;
11 int client_port;
12 ipv4_addr client;
14 p<udp_server_socket> udp_server;
16 fifo<buffer> incoming_data;
18 void receive(const ipv4_addr &addr, u16 sender_port, const buffer &data) {
19 if (addr != client || sender_port != client_port)
20 return;
22 incoming_data.push(data.copy());
25 public:
26 udp_remote_client_socket(p<transport_layer> tl, p<udp_server_socket> server) : remote_client_socket(tl), udp_server(server) { }
28 ~udp_remote_client_socket() {
29 close();
32 void set(const ipv4_addr &addr, int port, int serv_port, const buffer &data) {
33 client = addr;
34 client_port = port;
36 server_port = serv_port;
38 incoming_data.push(data.copy());
40 down.cast<udp>()->listen(server_port, udp::port_listener::method(this, &udp_remote_client_socket::receive));
43 ipv4_addr get_addr() const {
44 return client;
47 void write(const buffer &data) {
48 down.cast<udp>()->send(client, client_port, server_port, data);
51 void read(buffer &data) {
52 buffer buf = incoming_data.pop();
53 data.copy_data(buf);
56 void close() {
57 if (udp_server.valid()) {
58 udp_server->disconnect(this);
59 down.cast<udp>()->remove_listener(server_port, udp::port_listener::method(this, &udp_remote_client_socket::receive));
60 udp_server = p<udp_server_socket>::invalid;