Desidero creare un socket socket asincrono utilizzando l'evento SocketAsyncEventArgs.Progettazione server tramite SocketAsyncEventArgs
Il server deve gestire circa 1000 connessioni allo stesso tempo. Qual è il modo migliore per gestire la logica per ogni pacchetto?
Il progetto del server è basato su this MSDN example, quindi ogni socket avrà il proprio SocketAsyncEventArgs per la ricezione dei dati.
fare la roba logica all'interno della funzione ricezione. Nessun overhead verrà creato, ma poiché la prossima chiamata ReceiveAsync() non verrà eseguita prima che la logica sia stata completata, i nuovi dati non possono essere letti dal socket. Le due domande principali per me sono: Se il client invia molti dati e l'elaborazione logica è pesante, come sarà gestita dal sistema (pacchetti persi perché il buffer è pieno)? Inoltre, se tutti i client inviano dati allo stesso tempo, ci saranno 1000 thread, oppure esiste un limite interno e non è possibile avviare un nuovo thread prima che un altro completi l'esecuzione?
Utilizzare una coda. La funzione di ricezione sarà molto breve ed eseguirà velocemente, ma si avrà un sovraccarico decente a causa della coda. I problemi sono, se i tuoi thread di lavoro non sono abbastanza veloci sotto il carico del server, la tua coda può essere piena, quindi forse devi forzare il calo dei pacchetti. Hai anche il problema Producer/Consumer, che probabilmente può rallentare l'intera coda con molti lock.
Quindi, quello che sarà il progetto migliore, la logica in funzione di ricezione, la logica nel thread di lavoro o qualsiasi cosa completamente diversa mi è mancata finora.
Un'altra missione riguardante l'invio di dati.
È meglio avere un SocketAsyncEventArgs legato a un socket (analogico all'evento di ricezione) e utilizzare un sistema di buffer per effettuare una chiamata di invio per alcuni pacchetti di piccole dimensioni (supponiamo che i pacchetti altrimenti sarebbero a volte! un altro) o utilizzare un SocketAsyncEventArgs diverso per ogni pacchetto e memorizzarli in un pool per riutilizzarli?