Linux, les sockets non bloquants connecter

je veux créer une connexion non bloquante. Comme ceci:

socket.connect(); // returns immediately

pour cela, j'utilise un autre thread, une boucle infinie et un epoll Linux. Comme cette(pseudo-code):

// 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
  }
}

si j'exécute un serveur puis un client, tout fonctionne. Si j'exécute d'abord un client, attends un peu, exécute un serveur, alors le client ne se connecte pas.

Ce que je fais mal? Peut-être il peut être fait différemment?

11
demandé sur herolover 2013-07-21 11:14:00

1 réponses

vous devez suivre les étapes suivantes pour une connexion async:

  • créer un socket socket(..., SOCK_NONBLOCK, ...)
  • démarrer la connexion avec connect(fd, ...)
  • si la valeur de retour est ni 0 ni EINPROGRESS, puis Annuler avec erreur
  • attendre fd est signalé comme prêt pour la sortie
  • vérifier l'état de la socket avec getsockopt(fd, SOL_SOCKET, SO_ERROR, ...)

Pas de boucles - à moins que vous souhaitez gérer EINTR.

si le client est démarré en premier, vous devriez voir l'erreur ECONNREFUSED dans la dernière étape. Si cela se produit, fermez la prise et recommencer depuis le début.

il est difficile de dire ce qui ne va pas avec votre code, sans voir plus de détails. Je suppose que vous n'abandonnez pas les erreurs dans votre check_socket opération.

30
répondu nosid 2013-07-21 08:39:27