Ho bisogno di svuotare i dati su un socket (assicurandomi che non ci sia nulla da ricevere). Sfortunatamente, non c'è alcuna funzione per questo nel modulo socket python.Come svuotare un socket in python?
Ho implementato qualcosa in questo modo:
def empty_socket(sock):
"""remove the data present on the socket"""
input = [sock]
while 1:
inputready, o, e = select.select(input,[],[], 0.0)
if len(inputready)==0: break
for s in inputready: s.recv(1)
Cosa ne pensi? C'è un modo migliore per farlo?
Aggiornamento: non desidero modificare il timeout del socket. Qual è il motivo per cui preferisco una selezione a una lettura.
Aggiornamento: la domanda originale utilizzava il termine 'flush'. Sembra che "vuoto" sia un termine migliore.
Update - 2010-02-27: ho notato un bug quando la coppia ha chiuso. L'inputready è sempre pieno delle prese. Ho risolto questo aggiungendo un numero massimo di loop. C'è una soluzione migliore?
questo non è proprio un "flush" per dire. Dai un'occhiata agli esempi nella documentazione per leggere un socket. http://docs.python.org/library/socket.html#example – JimB
Hai mai pensato di utilizzare Twisted per il tuo programma? Se lo facessi, non avresti mai bisogno di fare nulla di simile. Twisted estrae immediatamente tutti i dati dallo zoccolo e lo recapita a voi ogni volta che arriva, quindi non c'è bisogno di scherzare con dettagli brutti come il problema select() descritto dalla risposta di Thomas qui sotto. – Glyph
@Glyph: No Non ho considerato Twisted perché volevo usare il modulo standard python per evitare dipendenze esterne. Grazie per questo commento, vedrò Twisted e forse riconsidererò la mia scelta. – luc