Ответ
Когда говорят, что сетевое приложение "слушает" порт (listens on a port), это означает, что оно зарезервировало за собой определённый порт на сетевом интерфейсе компьютера и ожидает входящие TCP/IP соединения от клиентов.
Этот процесс состоит из нескольких стандартных шагов с использованием системных вызовов (API сокетов):
-
Создание сокета (
socket
). Приложение запрашивает у операционной системы (ОС) конечную точку для коммуникации. -
Привязка сокета к адресу и порту (
bind
). Сокет связывается с конкретным IP-адресом и номером порта (например,192.168.1.5:8080
). С этого момента ОС считает данный порт занятым этим процессом. -
Перевод в режим прослушивания (
listen
). Приложение сообщает ОС, что сокет готов принимать входящие соединения. ОС создает очередь для запросов на подключение, если приложение занято обработкой текущего клиента. -
Принятие соединений (
accept
). Приложение входит в блокирующий режим ожидания. Как только клиент пытается подключиться, вызовaccept
возвращает новый сокет, через который будет происходить обмен данными с этим конкретным клиентом.
Пример на Python с использованием модуля socket
:
import socket
# 1. Создание TCP-сокета
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. Привязка к адресу и порту
server_socket.bind(('127.0.0.1', 8080))
# 3. Перевод в режим прослушивания (очередь на 5 соединений)
server_socket.listen(5)
print("Сервер слушает порт 8080...")
# 4. Принятие входящего соединения
client_socket, address = server_socket.accept()
print(f"Получено соединение от {address}")
# ... дальнейшая работа с client_socket ...
client_socket.close()
server_socket.close()
Ключевые моменты:
- Занятый порт: Попытка слушать уже занятый порт вызовет ошибку
Address already in use
. - Привилегированные порты: Порты с номерами ниже 1024 (например, 80 для HTTP, 443 для HTTPS) требуют прав администратора (root) для прослушивания.