2

我有一些关于如何处理连接超时的代码使用 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,这意味着连接被拒绝。我很困惑!使用非阻塞套接字时如何检查连接是否正确建立?

4

1 回答 1

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
}
于 2013-04-22T07:06:29.217 回答