libt2n: (tomj) fixed call of virtual function close() from destructor, fixed return...
[libt2n] / src / socket_client.cpp
index a26b004..fca01d1 100644 (file)
@@ -66,6 +66,7 @@ socket_client_connection::socket_client_connection(int _port, const std::string&
     {
         lastErrorMsg=e.what();
         LOGSTREAM(debug,"tcp connect error: " << lastErrorMsg);
+        // FIXME: Don't call virtual function in constructor. Currently not dangerous but bad design.
         close();
     }
 
@@ -94,6 +95,7 @@ socket_client_connection::socket_client_connection(const std::string& _path,
     {
         lastErrorMsg=e.what();
         LOGSTREAM(debug,"unix connect error: " << lastErrorMsg);
+        // FIXME: Don't call virtual function in constructor. Currently not dangerous
         close();
     }
 
@@ -101,6 +103,15 @@ socket_client_connection::socket_client_connection(const std::string& _path,
         do_callbacks(new_connection);
 }
 
+/**
+ * Destructor. Closes an open connection.
+ */
+socket_client_connection::~socket_client_connection()
+{
+    // Destructor of socket_handler will close the socket!
+}
+
+
 /// establish a connection via tcp
 void socket_client_connection::tcp_connect(int max_retries)
 {
@@ -175,6 +186,17 @@ void socket_client_connection::connect_with_timeout(struct sockaddr *sock_addr,u
 {
     set_socket_options(sock);
 
+   /* non-blocking mode */
+    int flflags;
+    flflags=fcntl(sock,F_GETFL,0);
+    if (flflags < 0)
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
+    flflags &= (O_NONBLOCK ^ 0xFFFF);
+    if (fcntl(sock,F_SETFL,flflags) < 0)
+        EXCEPTIONSTREAM(error,t2n_communication_error,"fcntl error on socket: " << strerror(errno));
+
+
     LOGSTREAM(debug,"connect_with_timeout()");
     int ret=::connect(sock,sock_addr, sockaddr_size);