我有一些使用libev的代码来处理如下所示的连接超时问题(请引用http://lists.schmorp.de/pipermail/libev/2011q2/001365.html):
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,这意味着连接被拒绝。我很困惑!使用非阻塞套接字时如何检查连接是否正确建立?
最佳答案
如果连接发生某些错误,getsockopt是一种可能的获取方式:
int err;
socklen_t len = sizeof(err);
getsockopt(sd, SOL_SOCKET, SO_ERROR, &err, &len);
if (err) {
// error happen
} else {
connection is OK
}
关于sockets - 将libev与非阻塞套接字一起使用时如何检查连接是否建立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16074981/