Использую функцию select и одноименного модуля для того чтобы отслеживать “активные” сокеты, т.е. те с которых можно читать и в которые можно писать. Насколько я понял функция возвращает кортеж из трех списков - первый состоит из сокетов из которых можно что-то прочитать (т.е. которые у себя там вызвали send или connect и теперь можно получить их сообщения), второй список - в которые можно что-то написать (т.е. которые сделили у себя recv и теперь мы можем им что-то послать с помощью send). Однако, по-моему функция работает как-то неправильно. (или я что-то не правильно понял?)
Я пишу что-то типа:
mainSock = socket(AF_INET, SOCK_STREAM)
mainSock.bind(('', port))
mainSock.listen(10)
checkList = []
checkList.append(mainSock)
while True:
rl, rl2, rl3 = select.select(checkList, checkList, [])
for s in rl:
if s == mainSock:
client, adr = s.accept()
checkList.append(client)
else:
try:
print "Received: " + s.recv(maxLength)
except:
checkList.remove(s)
Т.е. все соединения принимаем, и просто печатаем сообщения. Однако почему-то в списке rl оказываются и те сокеты, которые ничего не присылали. Например, если запустить следующий скрипт (типа клиент), то сервер принимает одно большое сообщения состоящее из 10 PING?, а затем крутится в бесконечном цикле и выводит следующую строку “Received: ” - то есть принимает пустое собщение от клиента, который уже давным-давно отключился. Хотя по идее когда клиент отключился или ничего не посылал, то вызов select должен заблокировать сервер.
s = socket(AF_INET, SOCK_STREAM)
s.connect(("localhost", port)) # socket used to communicate to coordinator
for i in xrange(10):
s.send("PING?")
s.shutdown(0)
s.close()
В общем, надеюсь всё более-менее понятно расписал, если кто сталкивался с такой проблемой - подскажите плз что я делаю не так.
ЗЫ использую CPython 2.7.1, под винду.