2017-07-05 3 views
0

Si vous envoyez un paquet UDP à un port/ip aléatoire qui n'écoute pas, python ferme le serveur qui l'a envoyé (provoquant un plantage)?L'UDP de Python se bloque lors de l'envoi vers une ip/port qui n'écoute pas

Est-ce que je fais quelque chose de mal ou est-ce un bug?

Exemple de question:

import socket 

# Launch the server 
try: 
    Sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    Sock.bind(("127.0.0.1", 25565)) 
except: 
    print("Failed to launch server") 

# Send a packet to a random (closed) place 
# Comment out this line to prevent error 
Sock.sendto(b'', ("127.0.0.1", 4623)) 


while True: 
    # Wait for data 
    print("Listening for data") 
    data, addr = Sock.recvfrom(1024) 

erreur:

line 18, in data, addr = Sock.recvfrom(1024) ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

Répondre

1

recvfrom peut échouer, même sur une socket UDP. Cela peut être fait par exemple si l'envoi précédent a essayé d'envoyer un paquet à un système où personne n'écoutait sur le port et le récepteur renvoyait un ICMP inaccessible.

Votre serveur se bloque uniquement car vous ne vous attendez pas à ce que recvfrom échoue, c'est-à-dire qu'il n'a pas été placé dans un bloc try comme vous l'avez fait avec le bind. Si vous rencontrez l'erreur attendue en utilisant un tel bloc, le serveur ne plantera pas mais gérera correctement l'erreur.

+0

Cela l'a corrigé! Je pense que cet exemple est exactement ce qui se passe ici. Pourquoi le message ICMP inaccessible provoque-t-il l'échec? Comment puis-je écrire du code qui détecte cela (autre que try: except?) Est-ce que le seul moyen de recvfrom peut échouer? Pourquoi n'ai-je pas lu à ce sujet dans la documentation? En regardant la page wikipedia pour IMCP, il y a beaucoup de types d'erreurs. Sont-ils les mêmes en python? Désolé pour tant de questions, merci de réparer! – Andev

+0

@Andev: répondre à toutes ces questions supplémentaires est hors contexte de l'original. Il y a plus de raisons pour lesquelles et comment recvfrom pourrait échouer, certaines d'entre elles dépendent du système d'exploitation. Je vous suggère d'étudier la documentation des fonctions natives utilisées par Pythons recvfrom, ie [recvfrom (2)] (https://linux.die.net/man/2/recvfrom), [recv (2)] (https: //linux.die.net/man/2/recv). Et à propos de tous ces trucs ICMP et similaires, vous pourriez étudier [Advanced Network Programming] (https://www.google.de/search?q=advanced+network+programming) –

+0

Merci! Je n'ai pas encore rencontré ce site web, alors je vais jeter un oeil! – Andev