diff --git a/plugins/pvio/pvio_socket.c b/plugins/pvio/pvio_socket.c
index 640f0c9..41720a6 100644
--- a/plugins/pvio/pvio_socket.c
+++ b/plugins/pvio/pvio_socket.c
@@ -610,12 +610,13 @@ static int pvio_socket_internal_connect(MARIADB_PVIO *pvio,
 
 #ifndef _WIN32
   do {
+    if (rc == -1 && errno == EAGAIN)
+      pvio_socket_is_alive(pvio);
     rc= connect(csock->socket, (struct sockaddr*) name, (int)namelen);
-  } while (rc == -1 && errno == EINTR);
+  } while (rc == -1 && (errno == EINTR || errno == EAGAIN));
   /* in case a timeout values was set we need to check error values
-     EINPROGRESS and EAGAIN */
-  if (timeout != 0 && rc == -1 && 
-     (errno == EINPROGRESS || errno == EAGAIN))
+     EINPROGRESS */
+  if (timeout != 0 && rc == -1 && errno == EINPROGRESS)
   {
     rc= pvio_socket_wait_io_or_timeout(pvio, FALSE, timeout);
     if (rc < 1)
@@ -1002,7 +1003,7 @@ my_bool pvio_socket_is_alive(MARIADB_PVIO *pvio)
   csock= (struct st_pvio_socket *)pvio->data;
 #ifndef _WIN32
   memset(&poll_fd, 0, sizeof(struct pollfd));
-  poll_fd.events= POLLPRI | POLLIN;
+  poll_fd.events= POLLPRI | POLLIN | POLLOUT;
   poll_fd.revents= POLLERR;
   poll_fd.fd= csock->socket;
 
@@ -1011,7 +1012,7 @@ my_bool pvio_socket_is_alive(MARIADB_PVIO *pvio)
     return FALSE;
   if (!(poll_fd.revents & POLLERR))
     return FALSE;
-  if (!(poll_fd.revents & (POLLIN | POLLPRI)))
+  if (!(poll_fd.revents & (POLLIN | POLLOUT | POLLPRI)))
     return FALSE;
   return TRUE;
 #else
