Comment puis-je tester socket TCP statut en Perl?
J'ai un socket TCP qui lit les données. Lorsqu'une erreur se produit lors de la lecture des données, que je retourne un undef (NULL) de la valeur. Les erreurs peuvent être causés par une mauvaise mise en forme des messages ou cassé sockets. Quelqu'un peut-il me dire si il existe une fonction qui retourne l'état d'un socket?
Qu'entendez-vous par l'état? Si c'est ouvert ou fermé?
Si la prise est dans un état valide, ce qui signifie que la connexion tcp est active
Si la prise est dans un état valide, ce qui signifie que la connexion tcp est active
OriginalL'auteur Gearoid Murphy | 2010-03-24
Vous devez vous connecter pour publier un commentaire.
Il y a trois façons pour détecter si la socket est fermée ou ouverte, mais aucun d'entre eux est 100% complète la preuve.
La première est la tentative de la lecture sur le support comme suit:
Si le socket a est passé par une fermeture ordonnée, c'est à dire par les pairs appelé
arrêt
, par écrit ou appeléfermer
ET laFIN
paquet arrive puis cet appel va entraîner une longueur 0 lire indiquant une socket fermée. Cela aide également si vos pairs application s'est écrasé depuis l'OS va fermer la connexion et envoyer unFIN
. Toutefois, si vos pairs machine est en panne ou votre pair application a enfermé ce ne sera pas vous aider car chaque extrémité de la connexion maintient état indépendant.Un deuxième moyen de détecter une coupure de connexion est en sondant vos pairs. Si vous envoyez un 0 paquet de longueur de vos pairs ( qui est en mesure de traiter ) et l'application a écrasé puis vous envoyer une seconde 0 longueur de paquet de votre application va obtenir le
SIG_PIPE
signal indiquant un bris de tuyau.Une autre façon de traiter ce problème est d'utiliser une application de niveau de battement de coeur dans lequel les pairs envoyer périodiquement un paquet de pulsations les uns des autres, indiquant qu'ils sont vivants et qu'il fonctionne correctement.
Une dernière option consiste à utiliser la
SO_KEEPALIVE
option de socket, même si c'est d'une utilité limitée, car il ne détectera une fracture de la prise après environ 2 heures d'inactivité.Si vous devez vraiment savoir assez rapidement lorsqu'une connexion est interrompue, puis les plus fiables de l'option est probablement va être le niveau d'application de battement de coeur.
MSG_DONTWAIT
drapeau de nomOriginalL'auteur Robert S. Barnes
doh!, la réponse est évidente, rétrospectivement, utilisez connecté à l'appel.
Vrai, mais dans mon cas, je sais que le message de décodage processus n'a pas pu de toute façon, ce que j'avais besoin d'un moyen de distinguer entre une mauvaise mise en forme des messages et brisé les sockets.
aussi, d'ailleurs, le connecté appel est mieux utilisé en conjonction avec la fonction de sélection.
OriginalL'auteur Gearoid Murphy