Normally, we should use getsockopt(fd, SOL_SOCKET, SO_ERROR) on a pending
connect() to detect whether the connection correctly established or not.

Unfortunately, getsockopt() does not report the status of a pending connection,
which means that it returns 0 if the connection is still pending. This has to
be expected, because as the name implies it, it only returns errors.

With the speculative I/O, a new problem was introduced : if we pretend the
socket was indicated as ready and we go to the socket's write() function,
a pending connection will then inevitably be identified as established.

In fact, there are solutions to this issue :

  - send() returns -EAGAIN if it cannot write, so that as long as there are
    pending data in the buffer, we'll be informed about the status of the
    connection

  - connect() on an already pending connection will return -1 with errno set to
    one of the following values :
      - EALREADY : connection already in progress
      - EISCONN  : connection already established
      - anything else will indicate an error.

=> So instead of using getsockopt() on a pending connection with no data, we
   will switch to connect(). This implies that the connection address must be
   known within the socket's write() function.


