Как заставить socket.listen (1) работать какое-то время, а затем продолжить оставшуюся часть кода? - PullRequest
3 голосов
/ 15 марта 2010

Я делаю сервер, который делает сокет 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 Ответ

13 голосов
/ 15 марта 2010

Вы можете установить время ожидания в сокете на максимальное количество времени, которое вы хотите ждать каждый раз (вызывайте его снова перед каждым listen временем, которое вы хотите ждать это время вокруг) - вы получите исключение, socket.timeout , если таймер истекает, поэтому убедитесь, что у него есть try / except socket.timeout:, чтобы поймать это дело. (A select.select с таймаутом также сработает и имеет преимущество в том, что может ожидать несколько сокетов и для различных условий, но он немного менее прямой как ответ на ваш очень специфический вопрос).

В прошлый раз я получил много отрицательных ответов, я дал такой ответ ... по-видимому, пуристами, которые хотят, чтобы никто никогда не проверял программы, которые они не одобряют (например, с помощью очень своеобразной конструкции, такой как ваша, в отличие от многих нормальный, обычный способ написания серверов). Посмотрим, что будет на этот раз! -)

...