1 #include "udp_server_socket.h"
2 #include "client_socket.h"
4 #include "libs/buffer.h"
7 class udp_remote_client_socket
: public remote_client_socket
{
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
)
22 incoming_data
.push(data
.copy());
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() {
32 void set(const ipv4_addr
&addr
, int port
, int serv_port
, const buffer
&data
) {
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 {
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();
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
;