libt2n: (tomj) fixed call of virtual function close() from destructor, fixed return...
[libt2n] / src / socket_handler.cpp
index 532c7f8..288ec66 100644 (file)
@@ -55,6 +55,31 @@ socket_handler::socket_handler(int _sock, socket_type_value _socket_type)
 {
 }
 
+/**
+ * Destructor. Closes open socket
+ */
+socket_handler::~socket_handler()
+{
+    if (sock != -1)
+    {
+        shutdown(sock,SHUT_RDWR);
+        ::close(sock);
+
+        sock = -1;
+    }
+}
+
+/// close the underlying socket connection. Don't call directly, use the version provided
+/// by the connection class you are using.
+void socket_handler::close()
+{
+    LOGSTREAM(debug,"close connection");
+    // graceful shutdown
+    shutdown(sock,SHUT_RDWR);
+    ::close(sock);
+
+    sock = -1;
+}
 
 /// set options like fast reuse and keepalive every socket should have
 void socket_handler::set_socket_options(int sock)
@@ -90,15 +115,6 @@ void socket_handler::set_socket_options(int sock)
         EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
 }
 
-/// close the underlying socket connection. Don't call directly, use the version provided
-/// by the connection class you are using.
-void socket_handler::close()
-{
-    // graceful shutdown
-    shutdown(sock,SHUT_RDWR);
-    ::close(sock);
-}
-
 /// is the underlying socket connection still open?
 bool socket_handler::is_closed()
 {
@@ -158,6 +174,7 @@ void socket_handler::set_write_timeout(long long new_write_timeout)
     @param[in,out] usec_timeout wait until new data is found, max timeout usecs.
             -1: wait endless
             0: return instantly
+    @param[out] usec_timeout_remaining microseconds from the timeout that were not used
 */
 bool socket_handler::data_waiting(long long usec_timeout,long long* usec_timeout_remaining)
 {
@@ -199,11 +216,12 @@ bool socket_handler::data_waiting(long long usec_timeout,long long* usec_timeout
     @param[in,out] usec_timeout wait until new data is found, max timeout usecs.
             -1: wait endless
             0: return instantly
+    @param[out] usec_timeout_remaining microseconds from the timeout that were not used
 */
-bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout, long long *timeout_remaining)
+bool socket_handler::fill_buffer(std::string& buffer, long long usec_timeout, long long *usec_timeout_remaining)
 {
     // fast path for timeout==0
-    if (usec_timeout==0 || data_waiting(usec_timeout,timeout_remaining))
+    if (usec_timeout==0 || data_waiting(usec_timeout,usec_timeout_remaining))
         return fill_buffer(buffer);
     else
         return false;
@@ -220,6 +238,7 @@ bool socket_handler::fill_buffer(std::string& buffer)
     char socket_buffer[recv_buffer_size];
 
     int nbytes = read (sock, socket_buffer, recv_buffer_size);
+
     if (nbytes < 0)
     {
         if (errno == EAGAIN)
@@ -263,7 +282,7 @@ bool socket_handler::fill_buffer(std::string& buffer)
 /// connection because it encapsulates the data.
 void socket_handler::socket_write(const std::string& data)
 {
-    int offset = 0;
+    unsigned int offset = 0;
     while (offset < data.size())
     {
         unsigned int write_size=write_block_size;