Ci possono essere casi in cui un socket viene segnalato come pronto ma al momento in cui viene controllato, cambia il suo stato.
Uno dei buoni esempi è l'accettazione delle connessioni. Quando arriva una nuova connessione, un socket di ascolto viene segnalato come pronto per la lettura. Nel momento in cui si arriva a chiamare accettare, la connessione potrebbe essere chiusa dall'altro lato prima di inviare qualsiasi cosa e prima abbiamo chiamato accept
. Naturalmente, la gestione di questo caso dipende dal sistema operativo, ma è possibile che accept
bloccherà semplicemente fino a quando non verrà stabilita una nuova connessione, il che farà sì che la nostra applicazione attenda per un tempo indefinito impedendo l'elaborazione di altri socket. Se la tua presa di ascolto è in modalità non bloccante, ciò non accadrà e otterrai EWOULDBLOCK
o qualche altro errore, ma il accept
non verrà bloccato.
Alcuni kernel avevano (spero sia stato risolto) un bug interessante con UDP e select
. Quando arriva un datagramma select
si sveglia con il socket con datagramma contrassegnato come pronto per la lettura. La convalida del checksum del datagramma viene posticipata fino a quando un codice utente non chiama recvfrom
(o qualche altra API in grado di ricevere datagrammi UDP). Quando il codice chiama e il codice di convalida rileva una mancata corrispondenza di checksum, un datagramma viene semplicemente eliminato e viene bloccato fino all'arrivo di un prossimo datagramma. Una delle patch che risolve questo problema (insieme alla descrizione del problema) può essere trovata here.
fonte
2012-10-07 21:12:58
Aha, grazie per quello. :) – CaptainCodeman