如何让socket.listen(1)在运行一段时间后继续执行代码?
我正在制作一个服务器,它会创建一个TCP套接字,并在一系列端口上工作。对于每个端口,它会在那个端口上监听一段时间,然后继续执行后面的代码。
就像这样:
import socket
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
msg =''
ports = [x for x in xrange(4000)]
while True:
try:
for i in ports:
sck.bind(('',i))
## sck.listen(1)
## make it just for some time and then continue this
## if there a connection do this
conn, addr = sck.accept()
msg = conn.recv(2048)
## do something
##if no connection continue the for loop
conn.close()
except KeyboardInterrupt:
exit()
那么我该如何让sck.listen(1)只在一段时间内工作呢?
1 个回答
16
你可以在套接字上设置一个超时时间,这个时间是你每次想要等待的最长时间(在每次调用 listen
之前都要重新设置一次这个时间)。如果超时了,你会遇到一个异常,叫做 socket.timeout,所以一定要用 try
/except socket.timeout:
来处理这种情况。还有一种方法是使用 select.select
,它也可以设置超时,并且可以同时监控多个套接字和不同的条件,但相对来说,这个方法对你这个具体问题的回答就没那么直接了。
上次我给出这样的回答时,收到了很多反对票……可能是一些追求完美的人不希望任何人用他们不赞同的方式编程(比如用你这种比较特殊的写法,而不是很多常见的服务器写法)。这次看看会发生什么吧!-)