Я связываю сокет с 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)
На этом этапе я ожидаю, что для моего сервера будет установлено много соединений.
Чтобы проверить это, я перехожу в свою интерактивную оболочку, и я печатаю:
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)
Вероятно, это оптимизация на стороне вашего браузера, попытка повторного использования одного и того же соединения - см. Http://en.wikipedia.org/wiki/HTTP_persistent_connection.
Если вы хотите убедиться, обнюхайте трафик с помощью wirehark, хотя ваш адрес на основе localhost может потребовать некоторой причудливой настройки.