Как настраивается сокет прослушивания Python? - PullRequest
0 голосов
/ 02 декабря 2018

Когда вы настраиваете простой прослушивающий сокет TCP с помощью модуля Python 'socket', какие этапы нужно выполнить?

Код, о котором я говорю, выглядит следующим образом:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('localhost', 50000))
s.listen(1)
conn, addr = s.accept()

* * * * * s = ... кажется довольно простым - вы выражаете свое намерение создать TCP-сокет ipv4, еще ничего не сделав.

Мне интересно следующее:

  • Что означает привязка к сокету без прослушивания?
  • Как работает ограничение числа неприемлемых соединений с помощью listen(n)?
    • Если у вас есть listen (1), вы находитесь в процессе обработки первого принятого вами соединения, и второй клиент пытается подключиться, ожидает ли второй клиент SYN-ACK?Или происходит трехстороннее рукопожатие, и он ожидает фактических данных?
    • Что произойдет, если третий клиент попытается подключиться - он сразу получит TCP RST?
    • Устанавливает ли числоздесь недопустимые соединения устанавливают какую-либо опцию в ядре, чтобы указать, сколько соединений оно должно принимать?Или все это обрабатывается в Python?
  • Как вы можете слушать, не принимая?Что значит принять соединение?

Каждая статья, с которой я сталкивался, кажется, просто предполагает, что эти шаги имеют смысл для всех, не объясняя, что именно делает каждая из них.Они просто используют общие термины, такие как

listen () начинает прослушивать соединения

bind () привязывает к сокету

accept () просто принимает соединение

Определение слова с помощью этого слова в определении является своего рода глупым способом объяснить что-либо.

1 Ответ

0 голосов
/ 02 декабря 2018

это в основном 1-к-1 из вызовов POSIX c, и поэтому я включаю ссылки на справочные страницы, чтобы вы могли прочитать их объяснение и соответствующий код c:

socket создает конечную точку связи с помощью файлового дескриптора в пространстве имен указанного семейства адресов, но не назначает ни адрес, ни порт.

bind назначает адрес и портк указанному сокету - порт, который может быть выбран случайным образом, если вы запрашиваете порт, для которого у вас нет прав доступа.(например, <1024 для пользователя без полномочий root) </p>

listen делает конкретный сокет и, следовательно, адрес и порт пассивным, что означает, что он будет принимать входящие соединения с вызовом accept.Чтобы обрабатывать несколько соединений одно за другим, вы должны указать журнал ожидания, содержащий их, а соединения, которые приходят, когда вы обрабатываете одно, добавляются.Как только резерв будет заполнен, система ответит таким образом на эти системы с помощью подхода, который заставляет их переподключаться, удерживая SYN, удерживая ответ ACK и т. Д. вам гораздо лучше.

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

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