1 #include "tcp_client_socket.h"
5 void tcp_client_socket::connect(const ipv4_addr
&addr
, int port
) {
8 client_port
= down
->acquire_port();
10 // down.cast<tcp>()->listen(client_port, tcp::port_listener::method(this, &tcp_client_socket::receive));
15 /* TCP three-way handshake
16 * Part I: SYN packet */
17 down
.cast
<tcp
>()->send(addr
, port
, client_port
, buffer::empty
, tcp::tcp_syn
, sequence_number
++, 0);
21 void tcp_client_socket::receive(const ipv4_addr
&addr
, u16 sender_port
, const buffer
&data
, tcp::tcp_flags flags
, int seq
, int ack
) {
22 if (addr
!= server
|| server_port
!= server_port
)
26 /* In the second part of handshake we should receive SYN/ACK packet */
27 if (flags
!= (tcp::tcp_syn
| tcp::tcp_ack
) || ack
!= sequence_number
- 1)
31 /* TCP three-way handshake
32 * Part III: ACK packet */
33 down
.cast
<tcp
>()->send(addr
, sender_port
, client_port
, buffer::empty
, tcp::tcp_ack
, sequence_number
++, seq
);
38 tcp_client_socket::tcp_client_socket(p
<transport_layer
> tl
) : client_socket(tl
) { }
39 tcp_client_socket::~tcp_client_socket() {
43 void tcp_client_socket::write(const buffer
&data
) {
44 down
.cast
<tcp
>()->send(server
, server_port
, client_port
, data
, tcp::tcp_none
, sequence_number
++, ack_number
);
47 void tcp_client_socket::read(buffer
&data
) { }
49 void tcp_client_socket::close() {
51 // down.cast<tcp>()->remove_listener(client_port, tcp::port_listener::method(this, &tcp_client_socket::receive));
52 down
->release_port(client_port
);