Alternativas a winsock2 con fuente de servidor de ejemplo en c ++
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
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.
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 ??em > 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 .