Per quanto riguarda il metodo C# e .NET System.Net.Sockets.Socket.AcceptAsync
, sarebbe necessario gestire un valore restituito di "false" per gestire lo stato immediatamente disponibile SocketAsyncEventArgs
dalla connessione elaborata in modo sincrono. Microsoft fornisce degli esempi (che si trovano sulla pagina della classe System.Net.Sockets.SocketAsyncEventArgs
) che causerà un sovraccarico dello stack in presenza di una grande quantità di connessioni in sospeso, che possono essere sfruttate su qualsiasi sistema che implementa il loro modello di gestione.Overflow dello stack quando si utilizza System.Net.Sockets.Socket.AcceptAsync model
Altre idee per aggirare questo problema sono creare un ciclo che richiami il metodo del gestore, con la condizione che il valore Socket.AcceptAsync
restituisca uguale a false e interrompa il ciclo (per consentire l'elaborazione posticipata) se il valore indica che l'operazione è in corso in modo asincrono (true). Tuttavia, questa soluzione causa anche una vulnerabilità di overflow dello stack a causa del fatto che il callback associato a SocketAsyncEventArgs
passato a Socket.AcceptAsync
ha alla fine del metodo una chiamata a Socket.AcceptAsync
, che ha anche un ciclo per le connessioni immediatamente disponibili, accettate in modo sincrono, .
Come potete vedere, questo è un problema piuttosto solido, e devo ancora trovare una buona soluzione che non coinvolge System.Threading.ThreadPool
e la creazione di tonnellate di altri metodi e l'elaborazione di pianificazione. Per quanto posso vedere, il modello di socket asincrono relativo a Socket.AcceptAsync
richiede più di quello dimostrato negli esempi su MSDN.
Qualcuno ha una soluzione pulita ed efficiente per gestire immediatamente le connessioni in attesa accettate in modo sincrono da Socket.AcceptAsync senza dover creare thread separati per gestire le connessioni e senza ricorrere alla ricorsione?
Sì, gli esempi su MSDN non sono sempre i migliori (o le migliori prassi, se è per questo). Puoi chiarire la tua domanda? Stai cercando un modo per lavorare con socket asyc che non causeranno StackOverflowExceptoin? – Oded
Questo è corretto; Sto cercando un modo non ricorsivo per gestire immediatamente le connessioni in sospeso. –
Vedere anche http://stackoverflow.com/questions/2002143/asynchronous-sockets-handling-false-socket-acceptasync-values – Lucero