强制套接字在python中超时

时间:2016-06-06 17:14:41

标签: multithreading sockets python-3.x

我使用套接字侦听while循环中的端口,socket.settimeout()设置5秒超时。但是我有另一个方法,它设置了监听端口,当用新端口调用时,我想强制套接字超时,这样我就可以重新初始化套接字并在while循环中设置适当的端口。有没有办法做到这一点?

套接字位于threading.Thread

的子类中

PS。由于这是我使用Python的第二天,因此欢迎任何有关任何部分的建议。谢谢

编辑:

我差点忘了。我想在调用setoutboundport方法时重新初始化套接字。

EDIT2

男人整个代码搞砸了。我重新审视了一切,而我想要实现的目标确实是错误的。只关注主要问题。定时插座。

import threading
import socket
import ResponseSender
import sys
import traceback

def __init__(self, inboundport, outboundip, outboundport, ttl=60):
    super(Relay, self).__init__()
    self.inboundport = inboundport
    self.outboundip = outboundip
    self.outboundport = outboundport
    self.ttl = ttl
    self.serverOn = True
    self.firstpacket = True
    self.sibling = None
    self.newoutboundport = 0
    self.listener = None
# ENDOF: __init__

def stop(self):
    self.serverOn = False
# ENDOF: stop

def setsiblingrelay(self, relay):
    self.sibling = relay
# ENDOF: setsiblingrelay

def setoutboundport(self, port):
    self.newoutboundport = port
# ENDOF: setoutboundport

def run(self):
    s = None
    try:
        while self.serverOn:
            if not s:
                s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

            if self.outboundport != self.newoutboundport:
                try:
                    s.close()
                except:
                    pass
                s.settimeout(4)
                s.bind(('', self.inboundport))
                print("Relay started :{0} => {1}:{2}".format(self.inboundport, self.outboundip, self.outboundport))

            print("---------------------------------------- LISTENING FOR INCOMING PACKETS")
            data, address = s.recvfrom(32768)
            print("Received {0} from {1}:{2} => sending to {3}:{4}"
                  .format(data, address[0], address[1], self.outboundip, self.outboundport))
            ResponseSender.sendresponse(address[0], address[1], data)
    except TimeoutError:
        pass
    except:
        print("Error: {0}".format(traceback.format_exception(*sys.exc_info())))
# ENDOF: run

0 个答案:

没有答案