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