Почему мой потоковый сокет ставит в очередь только одно соединение за раз из моего браузера? - PullRequest
1 голос
/ 05 сентября 2011

Я привязываю сокет к localhost: 8888, чтобы сделать простой сервер.
Вот простой скрипт на python, который я использовал для создания сервера.

import os
import socket
import fcntl

tuples = socket.getaddrinfo('localhost', 8888, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_PASSIVE | socket.AI_ADDRCONFIG)

res = tuples[0]

af, socktype, proto, canonname, sockaddr = res
sock = socket.socket(af, socktype, proto)

flags = fcntl.fcntl(sock.fileno(), fcntl.F_GETFD)
flags |= fcntl.FD_CLOEXEC
fcntl.fcntl(sock.fileno(), fcntl.F_SETFD, flags)

sock.setblocking(0)        
sock.bind(sockaddr)
sock.listen(128)
  1. Теперь я открываю этот скрипт с помощью интерактивной оболочки.
  2. Затем я захожу в свой браузер и захожу на http://localhost:8888,, который должен поставить в очередь соединение с моим сервером.
  3. Я повторяю последний шаг еще несколько раз, каждый раз внутри новой вкладки.

На данный момент, я ожидаю, что много соединений в очереди для моего сервера.

Чтобы проверить это, я захожу в интерактивную оболочку и набираю:

sock.accept()

Это работает с первой попытки, но при последующих попытках я получаю Erno 11 (EAGAIN), который говорит мне, что никакие другие соединения не поставлены в очередь. Однако в моем браузере небольшое "Соединение" спиннер по-прежнему собирается на каждой вкладке, которую я открыл! Я пробовал это в Chrome и Firefox.

Я написал свой собственный клиент, который подключается к localhost: 8888, и смог без проблем поставить в очередь подключения. Что здесь происходит?? Может кто-нибудь проверить, можно ли проверить этот эксперимент в своих браузерах?

Для удобства вот мой клиент:

import os
import socket
import fcntl

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 8888))
s.recv(1000)

1 Ответ

1 голос
/ 05 сентября 2011

Вероятно, это оптимизация на стороне вашего браузера, пытающаяся повторно использовать то же соединение - см. http://en.wikipedia.org/wiki/HTTP_persistent_connection.

Если вы хотите убедиться, перехватите трафик, используя wireshark , хотя для вашего адреса на основе локального хоста может потребоваться какая-то необычная настройка.

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