API сокета є фактичним стандартом для зв'язку TCP / IP та UDP / IP (тобто мережевий код, як ми це знаємо). Однак одна з його основних функцій accept()
- трохи магічна.
Для запозичення напівформального визначення:
accept () використовується на стороні сервера. Він приймає отриману вхідну спробу створити нове TCP-з'єднання з віддаленого клієнта та створює новий сокет, пов'язаний з парою адрес сокета цього з'єднання.
Іншими словами, accept
повертає новий сокет, через який сервер може спілкуватися з нещодавно підключеним клієнтом. Стара розетка (на яку accept
називались) залишається відкритою, на тому ж порту, слухаючи нові з'єднання.
Як accept
працює? Як це реалізується? На цю тему багато плутанини. Багато людей стверджують, що прийняття відкриває новий порт, і ви спілкуєтесь із клієнтом через нього. Але це очевидно не відповідає дійсності, оскільки новий порт не відкритий. Ви насправді можете спілкуватися через один і той же порт з різними клієнтами, але як? Коли декілька потоків дзвонять recv
на один і той же порт, як дані знають, куди звернутися?
Я думаю, що це щось уздовж рядків адреси клієнта, пов’язаних з дескриптором сокета, і кожного разу, коли дані надходять через recv
нього, він спрямовується на правильний сокет, але я не впевнений.
Було б чудово отримати ґрунтовне пояснення взаємодії цього механізму.