Programación General > Visual Basic 6.0 e inferiores
Re: Numero maximo de WINSOCK por servidor...
_EL_DJ_LU:
Elabore un programa para un ciber cafe, pero al inicio solo eran 10 maquinas, pero este fue creciendo, ahora tenemos 14 maquinas y pronto aumentaran a unas 20.
Modifique mi programa para 20 maquinas pero no se puede hacer como maximo puedo controlar 16 maquinas si es mas me sale No hay espacio disponible en el búfer.
Lo que hago es: para cada maquina uso un winsock en el servidor, lo que haria 20 winsock.
Alguien me podria ayudar con esto????
Porfa, no se como hacer.
De antemano muchas gracias, espero que esto no sea dificil para ustedes(LOS GRANDES)
observador:
Bueno... esta semana me ha ido muy mal, la chica me mando al carajo, me enferme, y la proxima semana tengo un examen global (4 unidades de un jalon, todo un semestre en un solo examen), eso sin contar de que hay mucho trabajo en el area donde estoy... Asi que no se porque, pero estoy feliz... y como estoy feliz y como veo que nadie te a contestado, pues yo te contesto... comenzemos...
Bien... Mira, no es necesario incluir un control Winsock por cada cliente que se vaya a conectar al servidor... en lugar de ello podemos utilizar una matriz de controles, y que se vaya agregando o cargando los winsock necesarios para la cantidad requerida de conexiones simultaneas...
Para ello declaramos una variable contador que nos indique cual es el ultimo elemento de matriz que se ha creado...
Esto lo logramos, poniendo en el evento ConnectionRequest del winsock un codigo como el siguiente:
--- Código: Text ---Private Sub WinsockServidor_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then IntMax = IntMax + 1 'Contador del ultimo cliente que solicito conectarse Load WinsockServidor(IntMax) 'Crea un nuevo elemento de la matriz de WinsockServidor WinsockServidor(IntMax).LocalPort = 0 WinsockServidor(IntMax).Accept requestID End IfEnd Sub Con esto le asignamos un control Winsock al nuevo cliente que está solicitando conectarse y le aceptamos la conexion...
Para saber y obtener los datos que se reciben de alguno de los clientes conectados solo ustilizaremos el valor de Index, que hace referencia al indice del control creado...
--- Código: Text ---Private Sub WinsockServidor_DataArrival(Index As Integer, ByVal bytesTotal As Long) Dim CadenaEntrante As String WinsockServidor(Index).GetData CadenaEntrante 'Obtiene el mensaje entrante segun que control lo envió 'Aqui procesamos los datos de entrada, que en este ejemplo quedaron 'almacenados en la variable local CadenaEntranteEnd Sub Algo muy importante que debe tomarse en cuenta, sobre todo para aplicaciones que pueden requerir de una gran cantidad de conexiones (simultaneas o no), es la eliminación (cuando ya no este en uso) del elemento de la matriz de Winsocks creado. Con esto, aparte de que liberamos memoria, tambien nos es util para que la aplicación no explote al llegar a un numero elevado de conexiones, que dependiendo del flujo de usuarios esta puede llegar en un par de semanas o inclusive dias (si la aplicacion tiene demasiada concurrencia, como los chats o servidores web, por ejemplo)... Esto lo solucionamos en el evento Close del Winsock y, como ya he mensionado, hacemos referencia al elemento de la matriz uilizando la variable Index... Veamos el codigo de ejemplo...
--- Código: Text ---Private Sub WinsockServidor_Close(Index As Integer) WinsockServidor(Index).Close 'Cierras la conexion con el Winsock cliente apuntado por Index Unload WinsockServidor(Index) 'Descargas el control de memoria para poder cargarlo de nuevo 'y usarlo más adelanteEnd Sub Con esto, podremos volver a cargar un elemento ya usado y eliminado... Supongamos que tu aplicacion estara ejecutandose siempre, y que la cantidad máxima de usuarios al dia es de 900. Esto quiere decir que al terminar el cuarto dia de estar funcionando ya habrá ira por el elemento 3600 (mas o menos) de la matriz de controles... y los elementos 1 a 900 ya no existen, entonces podemos volver a crearlos y con esto no llegar al limite establecido (32767), lo cual generaría un error de Desbordamiento. Segun las reglas de Visual Basic, se establece que el máximo número de elementos de una matriz de controles es el 32767, aunque tambien existen otras limitantes que dependen de las caracteristicas de Hardware de la maquina que funge como servidor... tal como la memoria física... pero eso es otra historia...
Asi, por ejemplo, si tu sabes que tu aplicacion no se va a usar por mas de 2000 usuarios simultaneamente (recuerda, puede ser cualquier numero entre 1 y 32767), pues puedes poner ese numero (tal ves configurable) como bandera para reiniciar tu contador. Con esto al codigo del evento ConnectionRequest se le agregaria una linea de mas, quedando algo asi como...
--- Código: Text ---Private Sub WinsockServidor_ConnectionRequest(Index As Integer, ByVal requestID As Long) If Index = 0 Then IntMax = IntMax + 1 'El identificador del ultimo cliente que solicito conectarse 'Si ya se sobrepasaron 2000 conexiones resetear el contador... 'Esto es para que se acepten 2000 clientes simultaneameante 'y al mismo tiempo una cantidad ilimitada de conexeciones If IntMax = 2001 Then IntMax = 1 'Linea agregada Load WinsockServidor(IntMax) 'Crea un nuevo elemento de la matriz de WinsockServidor WinsockServidor(IntMax).LocalPort = 0 WinsockServidor(IntMax).Accept requestID End IfEnd Sub Bueno, en teoria eso es lo necesario para permitir a un servidor ser multiusuario, usando el control Winsock...
Con respecto a la codificacion del programa cliente ésta no cambia en forma brusca con respecto al control Winsock, asi que de eso no te comento nada, ya que como te digo, basicamente no cambia, pues alli no necesitas crear matriz de control ni nada por el estilo... Inclusive, la aplicacion cliente que tienes no sera necerario que la recodifiques al implemantar matriz de Winsock en el Servidor... (a menos que quieras incluir otras caracteristicas claro...)
Mira... Hace algun tiempo hice un chat multiusuario, y aqui te adjunto una copia simplificada de los programas Cliente y Servidor, que este último es el que realmente te interesa...
Aqui te muestro las pantallas de los programas que te adjunto...
Servidor
Cliente
Probando
Como puedes ver en las imagenes, antes de contestarte verifique que el Servidor aceptara varios clientes, para lo cual hice 21 copias del programa cliente y los ejecute para conectarlos todos al servidor y si, como se esperaba, fueron aceptadas todas las solicitudes de conexion y todo transcurrio normalmente...
Bueno, cualquier duda sobre el codigo pues mi correo es santosbussines@hotmail.com
Bueno... me voy, tengo que seguir estudiando para mi examen...
_EL_DJ_LU:
Oe Muchas Gracias, esto me va a servir....
de verdad gracias, pero ahora estoy tratando de establecer comunicacion especificamente con un solo cliente, si no me sale, te paso la voz
GRACIAS...
DJ
_EL_DJ_LU:
Ya hice la prueba en conectarme(hablar con un solo cliente) pero no puedo el mensaje siempre le llaga a todos, he tratado de colocarle a cada controlador(index) un localport, pero no se puede, por lo que lo que escribo siempre le llaga a todos...
me podrias decir como puedo hacer para enviarle mensaje a solo un cliente sin que se entere nadie.....
muchas gracias....OBSERVADOR
DJ
HurryCrack:
sabes la ip de cada cliente ke conecta envia la respuesta solo con este.
De todas formas hace ya mas de 6 meses mande un cliente servidor completo, por ke no mirais un poco y vereis ke esta todo, oki? un saludo
:hippi:
Navegación
[#] Página Siguiente
Ir a la versión completa