2013-04-18 61 views
2

我对如何处理如下连接超时一些代码使用libev(请参考http://lists.schmorp.de/pipermail/libev/2011q2/001365.html):如何检查是否建立连接时使用libev与非块插座

sd = create_socket() 
set_socket_nonblock(sd) 
connect("127.0.0.1", port) // connect to an invalid port 
ev_io_init(&w_io, connect_cb, sd, EV_WRITE) 
ev_io_start(...) 
ev_timer_init(&w_timer, timeout_cb, 5.0, 0) 
ev_timer_start(...) 

,并在某处执行ev_run。 connect_cb被调用,在这个回调函数中,我用EV_ERROR检查了revents,结果没有错误。这很奇怪,因为我提供了一个无法在本地机器上侦听的无效端口号。无论如何,我尝试在connect_cb函数中发送一条消息,得到错误111,这意味着连接被拒绝。我很困惑!如何在使用非阻塞套接字时检查连接是否正确建立?

回答

1

的getsockopt是可能的方式,如果连接有一定的错误发生得:

int err; 
socklen_t len = sizeof(err); 
getsockopt(sd, SOL_SOCKET, SO_ERROR, &err, &len); 
if (err) { 
    // error happen 
} else { 
    connection is OK 
}