Pregunta

Estoy usando esta implementación de ejemplo que se encuentra en http: // tangentsoft. net / wskfaq / examples / basics / select-server.html

Esto hace la mayor parte de lo que necesito, maneja las conexiones sin bloquear y funciona todo en su subproceso (no creando un nuevo subproceso para cada conexión como lo hacen algunos ejemplos), pero estoy preocupado porque me han dicho que tengo a winock solo admitirá un máximo de 64 conexiones de cliente: S

¿Es esto 64 conexiones verdaderas?

¿Qué otras opciones tengo? Sería genial tener un ejemplo de c ++ para una implementación similar.

Gracias

¿Fue útil?

Solución

Biblioteca alternativa:

Debería considerar el uso de boost asio . Es una biblioteca de redes multiplataforma que simplifica muchas de las tareas que debe realizar.

Puede encontrar el código fuente de ejemplo que busca aquí .


Sobre el límite de 64:

No hay un límite de conexión duro que experimentará con un buen diseño. Básicamente, si utiliza algún tipo de modelo de subprocesamiento, no experimentará esta limitación.

Aquí hay información sobre el límite que escuchó:

  

4.9 - ¿Qué son las " 64 tomas " limitaciones?

     

Hay dos limitaciones de 64 sockets:

     

El mecanismo de eventos de Win32 (por ejemplo,   WaitForMultipleObjects ()) solo puede   espera en 64 objetos de evento a la vez.   Winsock 2 proporciona la   Función WSAEventSelect () que permite   utiliza el mecanismo de eventos de Win32 para   Espera eventos en sockets. Porque   usa el mecanismo de eventos de Win32, puedes   solo esperar eventos en 64 sockets en   un momento. Si quieres esperar más   de 64 objetos de evento Winsock en una   tiempo, necesitas usar múltiples   hilos, cada uno esperando no más de   64 de las tomas.

     

La función select () también está limitada   en ciertas situaciones a la espera de 64   zócalos a la vez. El FD_SETSIZE   constante definida en winsock.h   determina el tamaño del fd_set   Estructuras que pasas a seleccionar (). Sus   definido por defecto en 64. Puede   Definir esta constante a un valor más alto.   antes de #incluir winsock.h, y   esto anulará el valor predeterminado.   Desafortunadamente, al menos uno   pila Winsock no de Microsoft y algunos   Los proveedores de servicios en capas asumen la   por defecto de 64; ellos ignorarán   sockets más allá del 64 en más grande   fd_sets.

     

Puedes escribir un programa de prueba para probar   esto en los sistemas que planeas   Apoyo, para ver si no están.   limitado. Si lo son, puedes conseguir   alrededor de esto con hilos, tal como usted   sería con objetos de evento.

Fuente

Otros consejos

@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;
                }

A la OP:

¿Por qué no quieres usar winsock2? Podría intentar construir su propio servidor utilizando IOCP, aunque hacer esta multiplataforma es un poco complicado. Puedes ver Boost :: asio como sugirió Brian.

Antes de decidir que necesita 'alternativas a winsock2 " lea esto: Programación de red para Microsoft Windows .

En resumen, NO necesita una 'alternativa a Winsock2', debe comprender cómo usar los modelos de programación que se suministran para tener un efecto completo en la plataforma a la que se dirige. Luego, si realmente es necesario el código de los sockets multiplataforma que utiliza E / S asíncrona, mire ASIO, pero si no realmente necesita el código multiplataforma luego considera algo que realmente se centra en los problemas que puedes tener en la plataforma en los que necesitas concentrarte, es decir, en algo específico de Windows. Vuelva al libro mencionado anteriormente y eche un vistazo a las diversas opciones que tiene.

La opción más rentable y escalable es utilizar los puertos de finalización de E / S. Tengo un código gratuito disponible en aquí que lo hace bonito fácil de escribir un servidor que se adapte y funcione bien en una plataforma basada en Windows (NT); La página vinculada también enlaza con algunos artículos que he escrito sobre esto. Una comparación de mi marco de trabajo con ASIO se puede encontrar aquí: http://www.lenholgate.com/blog/2008/09/how-does-the-socket-server-framework-compare-to-boostasio.html .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top