web-dev-qa-db-fra.com

Linux, sockets, connexion non bloquante

Je veux créer une connexion non bloquante. Comme ça:

socket.connect(); // returns immediately

Pour cela, j'utilise un autre fil, une boucle infinie et une epoll linux. Comme ceci (pseudocode):

// 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 cela fonctionne. Si j'exécute d'abord un client, attendez un peu de temps, exécutez un serveur, puis le client ne se connecte pas.

Qu'est-ce que je fais mal? Peut-être que cela peut être fait différemment?

14
herolover

Il existe quelques façons de tester si un Connect non bloquant réussit.

  1. call GetPeername () d'abord, s'il a échoué avec erreur Enotconn, la connexion a échoué. puis appelez getockopt avec SO_Error pour obtenir l'erreur en attente sur la prise
  2. appelez avec une longueur de 0. Si l'échec de la lecture échouée, la connexion a échoué et que l'errno à lecture indique pourquoi la connexion a échoué; lire les retours 0 si la connexion réussit
  3. appelez-vous à nouveau; Si l'errno est EISConn, la connexion est déjà connectée et la première connexion a réussi.

Réf: Programmation de réseau Unix v1

1