Linux, sockets, connexion non bloquante
Je veux créer un blocage non connecter.
Comme ceci:
socket.connect(); //returns immediately
Pour cela, j'utilise un autre thread, une boucle infinie et Linux epoll. 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 je lance un serveur et un client, tout cela fonctionne. Si j'ai d'abord exécuter un client, attendre un certain temps, un serveur, le client ne se connecte pas.
Ce que je fais mal? Peut-être il peut être fait différemment?
source d'informationauteur herolover
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser les étapes suivantes pour un async connect:
socket(..., SOCK_NONBLOCK, ...)
connect(fd, ...)
0
niEINPROGRESS
alors abandonner avec l'erreurfd
est signalé comme prêt pour la sortiegetsockopt(fd, SOL_SOCKET, SO_ERROR, ...)
Pas de boucles, sauf si vous souhaitez gérer
EINTR
.Si le client est lancé tout d'abord, 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 quel est le problème avec votre code, sans voir plus de détails. Je suppose que vous n'avez pas annuler les erreurs dans votre
check_socket
opération.