如何使socket.listen(1)工作一段时间,然后继续其余的代码?

时间:2010-03-14 22:59:57

标签: python sockets ports

我正在制作一个服务器,它创建一个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 个答案:

答案 0 :(得分:13)

您可以在套接字上settimeout每次都要等待它的最长时间(在每个listen之前再次调用它到您想要等待的时间 this < / em>时间周围) - 如果计时器到期,您将获得例外socket.timeout,因此请确保周围有try / except socket.timeout:来捕获该情况。 (具有超时的select.select也可以工作,并且具有能够在多个套接字上等待并适用于各种条件的优点,但是对于您的特定问题的答案而言,它不那么直接。)

上次我给出了这样一个答案时,我得到了很多的支持......大概是纯粹主义者想要确保没有人,他们以不赞成的方式编程(例如通过像你这样的非常奇特的结构而不是许多正常,通常的写服务器方式)。让我们看看这次会发生什么! - )