Ожидаемое поведение для сокета select () при получении данных во время обработки других данных? - PullRequest
1 голос
/ 26 мая 2011

У меня есть концептуальный вопрос относительно программирования сокетов и запуска команды select в цикле while.Извлеките этот отрывок из примера эхо-сервера (написанного на python, но язык не имеет значения): http://ilab.cs.byu.edu/python/select/echoserver.html

while running: 
  inputready,outputready,exceptready = select.select(input,[],[]) 

  for s in inputready: 

    if s == server: 
        # handle the server socket 
        client, address = server.accept() 
        input.append(client) 

    elif s == sys.stdin: 
        # handle standard input 
        junk = sys.stdin.readline() 
        running = 0 

    else: 
        # handle all other sockets 
        data = s.recv(size) 
        if data: 
            s.send(data) 
        else: 
            s.close() 
            input.remove(s) 

Вопрос: каково ожидаемое поведение в процессе выполнения кода вцикл for, если новый клиент подключается и отправляет данные в этот момент?Существует ли какой-либо буфер, который является частью библиотеки сокетов по умолчанию, так что при последующем вызове select он сразу же вернется со значением, которое поступило во время обработки предыдущего запроса?Или новый клиент, подключающийся, пока сервер фактически не ожидает в select (), будет проигнорирован, и поэтому всегда возможно (хотя и маловероятно, учитывая, что мы говорим миллисекунды), чтобы запросы были отброшены?

(ПРИМЕЧАНИЕ. Я провел некоторое эмпирическое тестирование на другой кодовой базе, в которой используются сокеты, и выяснилось, что существует буфер - если он действительно задуман, каков типичный размер этого буфера?)

1 Ответ

3 голосов
/ 26 мая 2011

Сетевой стек ядра обрабатывает новые соединения асинхронно с вашим процессом и никогда не прервет входящее соединение, если оно не превысит listen backlog.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...