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?
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
niEINPROGRESS
, 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.