From: Li Zhijian <lizhi...@cn.fujitsu.com> -netdev socket,connect=xx:xx now is asynchronous to connect listening server, if we don't start listening server before connecting, no error is detected but we can connect to listening server forever.
Just report a error message in this case? Signed-off-by: Li Zhijian <lizhi...@cn.fujitsu.com> --- net/socket.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/net/socket.c b/net/socket.c index e8605d4..a82da36 100644 --- a/net/socket.c +++ b/net/socket.c @@ -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); -- 1.7.12.4