src/Network/TCP.cc
changeset 378 5589abf5e61b
parent 263 8c999cf4c182
child 380 d193dd1d8a7e
equal deleted inserted replaced
377:01d3c340b372 378:5589abf5e61b
     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 }