L'API socket è lo standard di fatto per le comunicazioni TCP / IP e UDP / IP (ovvero il codice di rete come lo conosciamo). Tuttavia, una delle sue funzioni principali accept()
è un po 'magica.
Per prendere in prestito una definizione semi-formale:
accept () viene utilizzato sul lato server. Accetta un tentativo in entrata ricevuto di creare una nuova connessione TCP dal client remoto e crea un nuovo socket associato alla coppia di indirizzi socket di questa connessione.
In altre parole, accept
restituisce un nuovo socket attraverso il quale il server può comunicare con il client appena connesso. Il vecchio socket (su cui è accept
stato chiamato) rimane aperto, sulla stessa porta, in attesa di nuove connessioni.
Come accept
funziona? Come viene implementato? C'è molta confusione su questo argomento. Molte persone affermano che accetta apre una nuova porta e tu comunichi con il cliente attraverso di essa. Ma questo ovviamente non è vero, poiché non è stata aperta alcuna nuova porta. Puoi effettivamente comunicare attraverso la stessa porta con client diversi, ma come? Quando più thread chiamano recv
sulla stessa porta, come fanno i dati a sapere dove andare?
Immagino che sia qualcosa sulla falsariga dell'indirizzo del cliente associato a un descrittore di socket, e ogni volta che i dati arrivano vengono recv
instradati al socket corretto, ma non ne sono sicuro.
Sarebbe bello avere una spiegazione approfondita del funzionamento interno di questo meccanismo.