@@ -46,6 +46,7 @@ typedef struct NetSocketState {
IOHandler *send_fn; /* differs between SOCK_STREAM/SOCK_DGRAM */
bool read_poll; /* waiting to receive data? */
bool write_poll; /* waiting to transmit data? */
+ bool connected; /* connect socket is connected */
} NetSocketState;
static void net_socket_accept(void *opaque);
@@ -424,6 +425,21 @@ err:
static void net_socket_connect(void *opaque)
{
NetSocketState *s = opaque;
+ int err = -1;
+ socklen_t len = sizeof(err);
+
+ if (s->listen_fd == -1 && !s->connected) {
+ if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &err, &len)) {
+ error_report("get socket opt error %s", strerror(errno));
+ /* FIXME: cleanup and exit ? */
+ } else if (err) {
+ errno = err;
+ error_report("net socket is not connected %s\n", strerror(errno));
+ /* FIXME: cleanup and exit ? */
+ } else {
+ s->connected = true;
+ }
+ }
s->send_fn = net_socket_send;
net_socket_read_poll(s, true);
}
@@ -451,6 +467,7 @@ static NetSocketState *net_socket_fd_init_stream(NetClientState *peer,
s->fd = fd;
s->listen_fd = -1;
+ s->connected = is_connected;
/* Disable Nagle algorithm on TCP sockets to reduce latency */
socket_set_nodelay(fd);