2017-11-16 72 views
1

私はソケットリスナスレッドを実行しており、特定の条件が満たされたときに閉じるべきです。私のコードスニペットがあります。pythonでudpソケットをシャットダウンする方法

def __init__(self, arg): 

     threading.Thread.__init__(self) 
     self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     receiver_port = int(<port>) 
     listen_addr = (<some ip>, receiver_port) 
     self.socket.bind(listen_addr) 
     self.shutdown = threading.Event() 
     self.shutdown.set() 

def kill_function(): 

     self.socket.shutdown(socket.SOCK_DGRAM) 
     self.shutdown.clear() 
     self.socket.close() 

私はユーザーSHUT_RD、SHUT_RDWR場合にも同じ問題が観察され

OSError: [Errno 107] Transport endpoint is not connected error when I try to 
kill the socket. 

に直面しています。 誰でもUDPソケットを使用している間shutdown()関数を呼び出す方法を教えてください。

ありがとうございます。

+0

同じレベルでメソッド( '__init__')と関数(' kill_function'、 'self')はありませんか? @KlausD。 –

+0

はい、殺す機能は自己を持って、それは誤植です –

答えて

1
self.socket.shutdown(socket.SOCK_DGRAM) 

shutdown UDPソケット用が、TCPには関係ありません。そして、shutdownは、シャットダウンの方法(SHUT_RDSHUT_WRSHUT_RDWR)に関する議論だけを取っています。

あなたのコードはUDPソケットをローカルアドレスにバインドしますが、別のアドレスに接続しません。すなわち、socket.sendtoを使用してどこでも送信できます。したがって、存在しない接続をシャットダウンするときにソケットが接続されていないというメッセージが表示されます。

関連する問題