sockets - 将libev与非阻塞套接字一起使用时如何检查连接是否建立

标签 sockets libev

我有一些使用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/

相关文章:

http - 应用程序如何在不与浏览器冲突的情况下使用端口 80/HTTP?

c++ - linux c++ libev 官方示例显示冗余控制台行为

c++ - 具有libev和自定义事件循环的C++ libhiredis

c - libev 中的 ev_loop 声明在哪里?

c - 为什么要在宏定义中使用 do { } while (0)?

c++ - 关于 ev_default_fork 的 libev 标志

javascript - 使用 websocket 的聊天应用程序

perl - 如何将 AnyEvent::Handler 与具有端口重用的套接字一起使用

python - ipsec.py 找不到属性 IPPROTO_UDP 和 socket.IPPROTO_IP

c - 带有填充的结构的补码校验和?