Comment définir le délai d'attente sur python socket recv méthode?
J'ai besoin de timeout sur python socket recv méthode. Comment faire?
- Pour info si vous ne choisissez d'utiliser des délais d'attente... vous avez besoin de savoir comment gérer le délai d'attente. ce DONC, la question parle de la manipulation lorsqu'un délai d'attente se produit: stackoverflow.com/questions/16745409
Vous devez vous connecter pour publier un commentaire.
L'approche classique consiste à utiliser sélectionnez() attendre jusqu'à ce que les données sont disponibles ou jusqu'à ce que le délai d'attente se produit. Seulement appel
recv()
lorsque les données sont disponibles. Pour être sûr, nous avons également établi la socket non bloquant mode de garantir querecv()
ne sera jamais bloquer indéfiniment.select()
peut également être utilisé pour attendre plus d'un socket à un moment.Si vous avez un grand nombre de descripteurs de fichiers ouverts, poll() est une alternative plus efficace à
select()
.Une autre option est de définir un délai d'attente pour toutes les opérations sur le support à l'aide de
socket.settimeout()
, mais je vois que vous avez explicitement rejeté cette solution dans une autre réponse.select
est bonne, mais la partie où vous dites: "vous ne pouvez pas" est trompeuse, car il estsocket.settimeout()
.select
-- si vous êtes en cours d'exécution sur une machine Windows,select
s'appuie sur la bibliothèque WinSock, qui a l'habitude de revenir, dès que certains données est arrivé, mais pas nécessairement tous de lui. Si vous avez besoin d'incorporer une boucle de continuer à l'appelerselect.select()
jusqu'à ce que toutes les données sont reçues. Comment vous savez que vous avez obtenu toutes les données sont (malheureusement) jusqu'à vous -- il peut signifier la recherche d'un terminateur de chaîne, un certain nombre d'octets, ou tout simplement en attente pendant un certain délai d'attente.ready[0]
seulement false si il n'y a pas de corps dans la réponse du serveur?selectors
est une alternative àselect
.il y a
socket.settimeout()
select
est préféré lorsque cette solution est en une seule ligne (plus facile à maintenir, à moins de risque dans la mise en œuvre de mal) et utilise select sous le capot (mise en œuvre est la même que l' @DanielStuzbach réponse).Comme mentionné à la fois
sélectionner.sélectionnez()
etsocket.settimeout()
fonctionne.Remarque vous devrez peut-être appeler
settimeout
deux fois pour vos besoins, par exemple.settimeout()
plus d'une fois, vous pouvez appeler lesetdefaulttimeout()
méthode en premier lieu.Vous pouvez définir délai d'attente avant la réception de la réponse et après avoir reçu la réponse de la définir à Aucun:
Le délai d'attente que vous êtes à la recherche pour la connexion de socket du délai d'expiration de ne pas la primaire du socket, si vous mettez en œuvre côté serveur. En d'autres termes, il y a un autre délai d'attente pour la prise de connexion de l'objet, qui est la sortie de
socket.accept()
méthode. Donc:Si vous implémentez le côté client, il serait simple.
Comme mentionné dans les réponses précédentes, vous pouvez utiliser quelque chose comme:
.settimeout()
Par exemple:
J'espère que cela aide!!
Vous pouvez utiliser
socket.settimeout()
qui accepte un argument entier représentant le nombre de secondes. Par exemple,socket.settimeout(1)
permettra de définir le délai d'attente de 1 secondeessayez cela, il utilise le sous-jacent C.
SO_RCVTIMEO
etSO_SNDTIMEO
.2
et pourquoi100
? Qui est la valeur de délai d'expiration? Dans quelle unité?timeval = struct.pack('ll', sec, usec)
s.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, timeval)
usec = 10000 signifie 10 ms