src/Network/TCP.cc
changeset 380 d193dd1d8a7e
parent 378 5589abf5e61b
child 381 9b35bc329d23
equal deleted inserted replaced
379:2a8e780844d2 380:d193dd1d8a7e
     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(), this, &NetworkTCPTransport::on_read);
    12     slots.connect(socket->sig_read(), this, &NetworkTCPTransport::on_read);
    13     slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write);
    13     slots.connect(socket->sig_write(), this, &NetworkTCPTransport::on_write);
       
    14     
       
    15     // activate read polling, but leave write polling for later
       
    16     socket->set_poll_read(true);
    14 }
    17 }
    15         
    18         
    16 NetworkTCPTransport::~NetworkTCPTransport (void) {
    19 NetworkTCPTransport::~NetworkTCPTransport (void) {
    17     // release socket
    20     // release socket
    18     delete socket;
    21     delete socket;
    41 
    44 
    42     } catch (NetworkSocketError &e) {
    45     } catch (NetworkSocketError &e) {
    43         // log and disconnect
    46         // log and disconnect
    44         Engine::log(ERROR, "tcp.on_read") << "socket error: " << e.what();
    47         Engine::log(ERROR, "tcp.on_read") << "socket error: " << e.what();
    45 
    48 
    46         _sig_disconnect();
    49         handle_disconnect();
    47     }
    50     }
    48 }
    51 }
    49 
    52 
    50 void NetworkTCPTransport::on_write (void) {
    53 void NetworkTCPTransport::on_write (void) {
    51     try {
    54     try {
    52         // just flush the output buffer
    55         // just flush the output buffer, and deactivate output polling if done
    53         out.flush_write();
    56         if (!out.flush_write())
       
    57             socket->set_poll_write(false);
    54 
    58 
    55     } catch (NetworkSocketError &e) {
    59     } catch (NetworkSocketError &e) {
    56         // log and disconnect
    60         // log and disconnect
    57         Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what();
    61         Engine::log(ERROR, "tcp.on_write") << "socket error: " << e.what();
    58 
    62 
    59         _sig_disconnect();
    63         handle_disconnect();
    60     }
    64     }
    61 }
    65 }
    62         
    66         
    63 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) {
    67 void NetworkTCPTransport::write_packet (const NetworkPacketBuffer &packet) {
    64     uint32_t prefix = packet.get_data_size();
    68     uint32_t prefix = packet.get_data_size();
    65     
    69     
    66     if (prefix != packet.get_data_size())
    70     if (prefix != packet.get_data_size())
    67         throw CL_Error("send prefix overflow");
    71         throw CL_Error("send prefix overflow");
    68     
    72     
    69     try {
    73     try {
    70         // just write to the output buffer
    74         // just write to the output buffer, but activate output polling if needed
    71         out.write_prefix((char *) packet.get_buf(), prefix);
    75         if (out.write_prefix((char *) packet.get_buf(), prefix))
       
    76             socket->set_poll_write(true);
    72 
    77 
    73     } catch (NetworkSocketError &e) {
    78     } catch (NetworkSocketError &e) {
    74         const char *err = e.what();
    79         const char *err = e.what();
    75 
    80 
    76         Engine::log(ERROR, "tcp.write_packet") << err;
    81         Engine::log(ERROR, "tcp.write_packet") << err;
    77         
    82         
    78         // XXX: these are not handled anywhere :(
    83         // XXX: these are not handled anywhere :(
    79         throw;    
    84         throw;    
    80     }
    85     }
       
    86 }
       
    87         
       
    88 void NetworkTCPTransport::handle_disconnect (void) {
       
    89     // disable events on our socket
       
    90     socket->set_poll_read(false);
       
    91     socket->set_poll_write(false);
       
    92 
       
    93     // signal
       
    94     _sig_disconnect();
    81 }
    95 }
    82 
    96 
    83 /*
    97 /*
    84  * NetworkTCPServer
    98  * NetworkTCPServer
    85  */
    99  */
    95     // listen
   109     // listen
    96     socket.listen(NETWORK_LISTEN_BACKLOG);
   110     socket.listen(NETWORK_LISTEN_BACKLOG);
    97     
   111     
    98     // use nonblocking sockets
   112     // use nonblocking sockets
    99     socket.set_nonblocking(true);
   113     socket.set_nonblocking(true);
       
   114     
       
   115     // activate polling
       
   116     socket.set_poll_read(true);
   100 }
   117 }
   101 
       
   102 
   118 
   103 void NetworkTCPServer::on_accept (void) {
   119 void NetworkTCPServer::on_accept (void) {
   104     // accept a new socket
   120     // accept a new socket
   105     NetworkSocket *client_sock = socket.accept(NULL);
   121     NetworkSocket *client_sock = socket.accept(NULL);
   106 
   122