Domanda

Sto usando questa implementazione di esempio disponibile in http: // tangentsoft. net / wskfaq / examples / basi / select-server.html

Questo sta facendo la maggior parte di ciò di cui ho bisogno, gestisce le connessioni senza bloccare e funziona tutto nel suo thread (non creare un nuovo thread per ogni connessione come fanno alcuni esempi), ma sono preoccupato da quando mi è stato detto a winsock supporterà solo un massimo di 64 client: S

Queste 64 connessioni sono vere?

Quali altre opzioni ho? Sarebbe bello avere un esempio c ++ per un'implementazione simile.

Grazie

È stato utile?

Soluzione

Biblioteca alternativa:

Dovresti considerare l'utilizzo di boost asio . È una libreria di rete multipiattaforma che semplifica molte delle attività che potresti dover svolgere.

Puoi trovare il esempio di codice sorgente che cerchi qui .


Informazioni sul limite 64:

Non esiste un limite di connessione 64 che si verificherà con un buon design. Fondamentalmente se usi qualche tipo di modello di threading non sperimenterai questa limitazione.

Ecco alcune informazioni sul limite di cui hai sentito parlare:

  

4.9 - Quali sono i "64 socket" limitazioni?

     

Esistono due limitazioni a 64 socket:

     

Il meccanismo dell'evento Win32 (ad es.   WaitForMultipleObjects ()) può solo   attendere 64 oggetti evento alla volta.   Winsock 2 fornisce il   Funzione WSAEventSelect () che consente   si utilizza il meccanismo di eventi di Win32 per   attendere eventi su socket. Perché   usa il meccanismo di eventi di Win32, puoi   attendere solo eventi su 64 socket a   un tempo. Se vuoi aspettare di più   di 64 oggetti evento Winsock in a   tempo, è necessario utilizzare più   thread, ognuno in attesa di non più di   64 prese.

     

Anche la funzione select () è limitata   in determinate situazioni di attesa su 64   prese alla volta. FD_SETSIZE   costante definita in winsock.h   determina la dimensione di fd_set   strutture passate per selezionare (). Suo   definito per impostazione predefinita su 64. È possibile   definire questa costante su un valore più alto   prima di te #include winsock.h e   questo sostituirà il valore predefinito.   Sfortunatamente, almeno uno   stack Winsock non Microsoft e alcuni   I fornitori di servizi a più livelli assumono il   impostazione predefinita di 64; ignoreranno   prese oltre il 64 ° in più   fd_sets.

     

Puoi provare un programma di prova   questo sui sistemi che prevedi   sostenere, per vedere se non lo sono   limitato. Se lo sono, puoi ottenere   intorno a questo con discussioni, proprio come te   sarebbe con oggetti evento.

Fonte

Altri suggerimenti

@ Brian:

                if ((gConnections.size() + 1) > 64) {
                    // For the background on this check, see
                    // www.tangentsoft.net/wskfaq/advanced.html#64sockets
                    // The +1 is to account for the listener socket.
                    cout << "WARNING: More than 63 client "
                            "connections accepted.  This will not "
                            "work reliably on some Winsock "
                            "stacks!" << endl;
                }

All'OP:

Perché non dovresti voler usare winsock2? Potresti provare a guardare alla creazione del tuo server usando IOCP, anche se rendere questa multipiattaforma è un po 'complicato. Potresti guardare Boost :: asio come ha suggerito Brian.

Prima di decidere che hai bisogno di 'alternative a winsock2 " leggi questo: Programmazione di rete per Microsoft Windows .

In sintesi, NON È NECESSARIA un'alternativa a Winsock2, è necessario comprendere come utilizzare i modelli di programmazione forniti a pieno effetto sulla piattaforma di destinazione. Quindi, se in realtà ne hai bisogno codice socket multipiattaforma che utilizza I / O asincrono, guarda ASIO, ma, se non hai davvero bisogno di codice multipiattaforma, quindi prendere in considerazione qualcosa che in realtà si concentra sui problemi che potresti avere sulla piattaforma su cui devi concentrarti, ovvero qualcosa di specifico di Windows. Torna al libro sopra menzionato e dai un'occhiata alle varie opzioni che hai.

L'opzione più performante e scalabile è usare le porte di completamento IO. Ho del codice gratuito disponibile da qui che lo rende carino facile scrivere un server che si ridimensiona e funziona bene su una piattaforma basata su Windows (NT); la pagina collegata collega anche ad alcuni articoli che ho scritto su questo. Un confronto tra il mio framework e ASIO è disponibile qui: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top