2017-07-05 3 views
0

リッスンしていないランダムなIP /ポートにUDPパケットを送信すると、pythonはそれを送信したサーバを閉じてクラッシュします。リッスンしていないip/portに送信すると、PythonのUDPクラッシュが発生する

私は何か間違っているのですか、これはバグですか?問題の

例:

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) 

エラー:

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

答えて

1

recvfromも、UDPソケット上で、失敗する可能性があります。これは、例えば、以前の送信が、誰もポートでリッスンしていないシステムにパケットを送信しようとしたときに、受信側がICMP到達不能を返送した場合に実行できます。

サーバーがクラッシュするのは、recvfromが失敗するとは思わない、つまり、bindの場合と同じように、試しブロックにラップしなかったためです。このようなブロックを使用して予期したエラーをキャッチすると、サーバーはクラッシュせずにエラーを適切に処理します。

+0

それを修正しました!私はその事例がまさにここで起こっていると思います。なぜICMP到達不能の原因が失敗するのですか?それを検出するコードを作成するにはどうすればよいですか(try:except?以外)recvfromが失敗する唯一の方法ですか?なぜ私はドキュメントでこれについて読んでいないのですか? IMCPのウィキペディアのページを見ると、多くの種類のエラーがあります。彼らはPythonで同じですか?非常に多くの質問を申し訳ありません、修正していただきありがとうございます! – Andev

+0

@Andev:これらすべての追加の質問に答えるのは、元の質問の文脈から外れています。なぜ、どのようにrecvfromが失敗するか、これらのいくつかはOSに依存する方法があります。 Pythons recvfromで使用されているネイティブ関数のドキュメント、つまり[recvfrom(2)](https://linux.die.net/man/2/recvfrom)、[recv(2)](https: //linux.die.net/man/2/recv)。そして、これらのICMPやこれに類するものについて、[Advanced Network Programming](https://www.google.de/search?q=advanced+network+programming) –

+0

ありがとうございました!私は前にそのウェブサイトに出くわしていないので、私は見てみましょう! – Andev

関連する問題