Como fazer o Socket.Listen (1) funcionar por algum tempo e depois continuar o restante do código?

StackOverflow https://stackoverflow.com/questions/2444178

  •  20-09-2019
  •  | 
  •  

Pergunta

Estou fabricando servidor que faz um soquete TCP e funcionará por meio do intervalo de portas, com cada porta, ele ouvirá nessa porta por algum tempo e continuará o restante do código.

assim::

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()

Então, como eu poderia fazer Sck.Listen (1) funcionar apenas por algum tempo?

Foi útil?

Solução

Você pode setTimeout no soquete até a quantidade máxima de tempo, você deseja esperar a cada vez (ligue novamente antes de cada listen até o tempo que você quer esperar isto tempo por aí) - você terá uma exceção, Socket.Timeout, se o timer expirar, portanto, tenha um try/except socket.timeout: Em torno dele para pegar esse caso. (UMA select.select Com um tempo limite também funcionaria e tem a vantagem de poder esperar em vários soquetes e em várias condições, mas é um pouco menos direto como resposta para sua pergunta muito específica).

Recebi muitos votos da última vez que dei essa resposta ... presumivelmente por puristas que querem garantir que ninguém nunca, programas da maneira que eles desaprovam (por exemplo, através de uma construção muito peculiar, como a sua, em oposição aos muitos normais e usuais comuns maneira de escrever servidores). Vamos ver o que acontece desta vez!-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top