2016-07-25 8 views
1

私はセンサーにデータを送信したいのですが、pythonスクリプトがデータを受信しない場合、受信機能がタイムアウトしてデータを再送します。私はそれは、例えば後にタイムアウトしたいしかしPython UDPソケットはデータが受信されない場合にデータを再送信します

data, addr = sock.recvfrom(1024) 

:それはすべてのデータを受信しない場合には、受信機能で立ち往生瞬間

def subscribe(): 
    UDP_IP = "192.168.1.166" 
    UDP_PORT = 10000 
    MESSAGE = '6864001e636caccf2393730420202020202004739323cfac202020202020'.decode('hex') 
    print "UDP target IP:", UDP_IP 
    print "UDP target port:", UDP_PORT 
    print "message:", MESSAGE 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.sendto(MESSAGE, (UDP_IP, UDP_PORT)) 
    recieve_data = recieve() 
    if recieve_data == subscribe_recieve_on or recieve_data == subscribe_recieve_off: 
     logging.info('Subscribition to light successful') 
    else: 
     logging.info('Subscribition to light unsuccessful') 

def recieve(): 
    UDP_IP = "192.168.1.118" 
    UDP_PORT = 10000 
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP  
    sock.bind((UDP_IP, UDP_PORT)) 
    data, addr = sock.recvfrom(1024) 
    return data.encode('hex') 

subscribe() 

2秒後にsubscribe()関数を再実行します。

私はtimeoutとtry/exceptionを使ってwhile真の文を使ってみましたが、ポートを閉じていても現在使用中のポートを取得しています。また、このように感じるのは面倒です。

すべてのアイデアをいただければ幸いです。

答えて

0

これらの関数のいずれかを呼び出すたびに、ソケットを最初に閉じることなくソケットを再作成するため、「現在使用中」例外が発生します。

事前にソケットを作成してください。受信ソケットが作成される前に応答が来るかもしれません。この場合、パケットは単に拒否されます。

次に、ループ内でsendto - recvfromコールだけを試す必要があります。

はまた、あなたのいずれかは、それがその後、タイムアウト例外をキャッチしたり、任意のデータを受信して​​いるかどうかを確認するselectまたはpollのようなポーリングメカニズムを使用してブロックされないように、受信側のソケットにsettimeoutでタイムアウトを設定する必要があります。

関連する問題