Linux, сокеты, неблокирующее подключение

Я хочу создать неблокирующее соединение. Вот так:

socket.connect(); // returns immediately

для этого я использую другой поток, бесконечный цикл и Linux epoll. Вот так (псевдокод):

// in another thread
{
  create_non_block_socket();
  connect();

  epoll_create();
  epoll_ctl(); // subscribe socket to all events
  while (true)
  {
    epoll_wait(); // wait a small time(~100 ms)
    check_socket(); // check on EPOLLOUT event
  }
}

Если я запускаю сервер и клиент, все работает. Если я сначала запускаю клиент, подождите некоторое время, запустите сервер, тогда клиент не подключается.

что я делаю не так? Может быть, это можно сделать по-другому?

1 ответов


вы должны использовать следующие шаги для асинхронного подключения:

  • создать сокет с socket(..., SOCK_NONBLOCK, ...)
  • процесс пуска в связи с connect(fd, ...)
  • если возвращаемое значение не является ни 0, ни EINPROGRESS, затем прервать с ошибкой
  • подождите, пока fd сигнализируется как готов к выходу
  • проверьте состояние сокета с getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
  • сделал

нет петель-если вы не хотите обрабатывать EINTR.

если клиент запускается первым, вы должны увидеть ошибку ECONNREFUSED в последнем шаге. Если это произойдет, закройте сокет и начните с самого начала.

трудно сказать, что не так с вашим кодом, не видя более подробной информации. Я полагаю, что вы не прерываете на ошибках в вашем check_socket операции.