Je suis en train d'implémenter un serveur dans lequel j'écoute pour que le client se connecte en utilisant l'appel accept socket.Intervalle de temps entre les appels de socket ie. Accepter() et recv/envoyer des appels
Après l'acceptation se produit et je reçois le socket, j'attends environ 10-15 secondes avant de faire le premier appel recv/send.
L'envoi d'appels au client échoue avec errno = 32, c'est-à-dire un tube rompu.
Comme je ne contrôle pas le client, j'ai réglé l'option de socket * SO_KEEPALIVE * dans le socket accepté.
const int keepAlive = 1;
acceptsock = accept(sock, (struct sockaddr*)&client_addr, &client_addr_length)
if (setsockopt(acceptsock, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive)) < 0)
{
print(" SO_KEEPALIVE fails");
}
Quelqu'un pourrait-il nous dire ce qui ne va pas ici et comment pouvons-nous empêcher la fermeture du socket client?
NOTE Une chose que je veux ajouter ici est que s'il n'y a pas d'écart de temps ou moins de 5 secondes entre les accepter et envoyer/appels recv, la communication client-serveur se produit comme prévu.
Sous Linux, vous pouvez obtenir errno = 32 pour erreur: ENOTCONN aussi, ce qui signifie le socket n'est pas connecté, et aucune cible n'a été donnée. Veuillez voir que les syscalls que vous avez effectués avant de lancer send/recv ne retournent pas les erreurs. – Aravind
Avez-vous vérifié que 'connect()' a bien fonctionné et vous avez averti qu'une connexion complète était disponible avant de commencer à appeler 'send()'? Normalement, les sockets ne se ferment pas après une période d'inactivité, et 10 à 15 secondes sont trop courtes pour que SO_KEEPALIVE ferme une connexion inactive et 10 à 15 secondes pour un pare-feu/routeur externe connexion inactive. Donc, quelque chose d'autre se passe. Je suppose que vous ne gérez pas votre socket client correctement. –
@Aravind et Remy .. Oui le connect() réussit parce que l'acceptation d'un appel qui bloque donne un accpetsock valide. De plus, les données sont reçues du client deux fois ou trois fois avant que je commence à recevoir l'erreur 32.Comme je l'ai déjà mentionné je ne possède pas le client et le client fonctionne s'il n'y a pas d'attente entre l'acceptation et l'envoi/réception d'appels. – Rajat