Interfejs API gniazd jest de facto standardem komunikacji TCP / IP i UDP / IP (czyli znanym nam kodem sieciowym). Jednak jedna z jego podstawowych funkcji accept()
jest nieco magiczna.
Aby pożyczyć definicję półformalną:
accept () jest używana po stronie serwera. Akceptuje odebraną próbę utworzenia nowego połączenia TCP od klienta zdalnego i tworzy nowe gniazdo skojarzone z parą adresów gniazda tego połączenia.
Innymi słowy, accept
zwraca nowe gniazdo, przez które serwer może komunikować się z nowo podłączonym klientem. Stare gniazdo (na którym accept
zostało wywołane) pozostaje otwarte, na tym samym porcie, nasłuchując nowych połączeń.
Jak to accept
działa? Jak to jest realizowane? W tym temacie jest wiele nieporozumień. Wiele osób twierdzi, że akceptacja otwiera nowy port i za jego pośrednictwem komunikujesz się z klientem. Ale to oczywiście nieprawda, ponieważ żaden nowy port nie jest otwierany. W rzeczywistości możesz komunikować się przez ten sam port z różnymi klientami, ale jak? Kiedy kilka wątków łączy się recv
z tym samym portem, skąd dane mają wiedzieć, gdzie iść?
Wydaje mi się, że jest to coś w rodzaju adresu klienta związanego z deskryptorem gniazda, a ilekroć dane przechodzą recv
, są kierowane do właściwego gniazda, ale nie jestem pewien.
Byłoby wspaniale uzyskać dokładne wyjaśnienie wewnętrznego działania tego mechanizmu.