2013-06-12 5 views
-2

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.

+0

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

+1

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. –

+0

@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

Répondre

0

connect(2) et send(2) sont deux appels système distincts effectués par le client. Le premier initie TCP three-way handshake, le second met en file d'attente les données d'application pour la transmission.

Du côté du serveur cependant, vous pouvez commencer à send(2) données -ing à la prise connectée immédiatement après réussieaccept(2) (à savoir ne pas oublier de vérifier acceptsock contre -1).

+0

Je suppose que vous n'avez pas compris ma question. Merci pour la clarification cependant. Veuillez le parcourir à nouveau. Je fais la vérification de l'acceptock contre -1 et il échoue car le socket est valide. – Rajat

+0

Vous devez expliquer alors quel est le problème réel. Ajoutez plus d'informations comme le protocole au niveau de l'application utilisé sur les sockets et ce que vous pensez qu'il devrait se passer. –

0

After the accept happens and I receive the socket, i wait for around 10-15 seconds before making the first recv/send call.

Pourquoi? Voulez-vous dire que le client prend autant de temps pour envoyer les données? ou que vous venez juste autour du serveur pendant 10-15s entre accept() et recv(), et si oui, pourquoi?

The send calls to the client fails with errno = 32 i.e broken pipe.

Le client a donc fermé la connexion.

Since I don't control the client, i have set socket option SO_KEEPALIVE in the accepted socket.

Cela n'empêchera pas le client de fermer la connexion.

Could anyone please tell what may be going wrong here

Le client ferme la connexion.

and how can we prevent the client socket from closing ?

Vous ne pouvez pas.

+0

Bref, ce que vous voulez dire, c'est qu'il n'y a rien à faire ici. J'attends parce qu'il y a des données qui doivent être traitées et qui doivent être envoyées au client. Il n'y a donc pas d'autre choix que d'attendre ces données avant d'envoyer des données au client. – Rajat

+0

@Rajat 'En bref' je l'ai déjà dit, dans les mots de mon choix: 'vous ne pouvez pas'. Ne me dis pas ce que je veux dire. Je suis extrêmement allergique à ce genre de chose. J'ai déjà dit ce que je voulais dire, et je n'ai besoin d'aucune paraphrase. Je constate que vous n'avez répondu à aucune de mes questions. – EJP

Questions connexes