alternative a winsock2 con sorgente server di esempio in c ++
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
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.
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 .