2013-04-18 1 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 и в этой функции обратного вызова я проверил revents с помощью EV_ERROR, результат не является ошибкой. Это странно, потому что я предоставляю неверный номер порта, который не прослушивается на локальной машине. Во всяком случае, я пытаюсь отправить сообщение в функцию 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 
} 
Смежные вопросы