In che modo i loop di rete "catturano" effettivamente le connessioni?

3

Prendiamo ad esempio un semplice web server nel ciclo di C:

while(1)
{
    /*accept connection that comes into server_socket and assign
      its handle to client_socket*/
    client_socket = accept(server_socket, NULL, NULL);

    /*send data to the client thru the client_socket*/
    send(client_socket, http_header, sizeof(http_header), 0);
    close(client_socket);
}     

A un livello più profondo, ciò che impedisce, ad esempio, una connessione in entrata di colpire la porta nel momento in cui questo ciclo supera la porzione client_socket = accept() ma prima della parte close () e la connessione non viene vista / accettato?

Il codice socket della connessione client sottostante genera generalmente un sacco di richieste sul server fino a quando non viene "catturato" e allora la connessione è stata stabilita?

Un'analogia simile a quello che sto chiedendo è che stavo correndo su una pista di 400 metri più e più volte, facendo un giro ogni 2 minuti. Mentre sono dalla parte opposta della pista, il mio amico arriva per provare a darmi il cinque, ma io sono dall'altra parte. 10 secondi dopo, se ne va, quindi così mi è "mancato". Quindi cosa impedisce che questo tipo di cose si verifichi nel contesto di una connessione loop / socket while come questa, specialmente dove potrebbe esserci più codice di questo semplice programma?

    
posta the_endian 09.02.2017 - 21:23
fonte

2 risposte

4

Esiste una cosa chiamata "arretrato" che è una coda in cui le connessioni in entrata rimangono temporaneamente finché non hai avuto la possibilità di accept di esse. Esiste proprio in modo tale da permetterti di dedicare del tempo a fare cose tra chiamate successive a accept .

La lunghezza del backlog è un parametro del metodo listen() , che è il punto in cui hai ottenuto il tuo server_socket . Se il valore specificato è troppo piccolo e viene ricevuto un numero elevato di richieste simultanee per la connessione, si rischia di perdere alcune connessioni a causa della visualizzazione occupata.

Una volta che sai come viene chiamato, puoi cercarlo e trovare articoli molto interessanti che spiegano esattamente come funziona, come questo:

link

Inoltre, nel caso ti stia chiedendo quale valore specificare per backlog , c'è questa domanda di stackoverflow correlata: link

    
risposta data 09.02.2017 - 21:57
fonte
3

Ascoltare su una porta non è come fare giri intorno a una pista e cercare di battere il tuo amico. È più come fare giri attorno al tuo complesso di appartamenti e controllare la posta ogni volta. Occasionalmente quando vieni in giro, qualcuno ha lasciato cadere qualcosa nella tua casella di posta, quindi lo raccogli e fai qualcosa con esso.

Nel caso di porte / socket, l'hardware riceve un messaggio su una determinata porta (nel caso di server Web, in genere porta 80 o 443). Poi dice "ok, chi è interessato a questo?" e quindi invia un interrupt hardware al programma e rilascia il "messaggio" nella "casella di posta". Quindi il tuo codice lo preleva la prossima volta e lo fa.

    
risposta data 09.02.2017 - 21:32
fonte

Leggi altre domande sui tag