Я привязываю сокет к 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)
- Теперь я открываю этот скрипт с помощью интерактивной оболочки.
- Затем я захожу в свой браузер и захожу на http://localhost:8888,, который должен поставить в очередь соединение с моим сервером.
- Я повторяю последний шаг еще несколько раз,
каждый раз внутри новой вкладки.
На данный момент, я ожидаю, что много соединений в очереди для моего сервера.
Чтобы проверить это, я захожу в интерактивную оболочку и набираю:
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)