API сокетов является стандартом де-факто для TCP / IP и UDP / IP-коммуникаций (то есть для сетевого кода, каким мы его знаем). Однако, одна из его основных функций, accept()
немного волшебна.
Чтобы заимствовать полуформальное определение:
accept () используется на стороне сервера.
Он принимает полученную входящую попытку
создать новое соединение TCP из
удаленный клиент, и создает новый
сокет, связанный с сокетом
пара адресов этого соединения.
Другими словами, accept
возвращает новый сокет, через который сервер может взаимодействовать с вновь подключенным клиентом. Старый сокет (на котором был вызван accept
) остается открытым на том же порту, ожидая новых подключений.
Как работает accept
? Как это реализовано? В этой теме много путаницы. Многие люди утверждают, что принять открывает новый порт, и вы общаетесь с клиентом через него. Но это, очевидно, не соответствует действительности, так как новый порт не открыт. Вы действительно можете общаться через один и тот же порт с разными клиентами, но как? Когда несколько потоков вызывают recv
на одном и том же порту, как данные узнают, куда идти?
Я предполагаю, что это что-то вроде того, что адрес клиента связан с дескриптором сокета, и всякий раз, когда данные поступают через recv
, они направляются в правильный сокет, но я не уверен.
Было бы здорово получить подробное объяснение внутренней работы этого механизма.