• Miércoles 6 de Noviembre de 2024, 07:40

Autor Tema:  Winsock, Aunke Realmente No Se Se Es Posible  (Leído 2211 veces)

Sagutxo

  • Miembro MUY activo
  • ***
  • Mensajes: 320
    • Ver Perfil
Winsock, Aunke Realmente No Se Se Es Posible
« en: Sábado 24 de Septiembre de 2005, 12:44 »
0
Salu2. Aquí va otra duda.

   Tengo hecho un porg cliente y un servidor, de mensaje instantaneo, mi problema es que no admite mas de una conexion por el mismo puerto, y eso me complica mucho la vida.

   ¿Hay alguna forma de simular un estilo FTP, muchas personas acceden a un mismo sitio, con un solo Puerto abierto?

El formulario tiene un control Time y un control Winsock como era de esperar  :whistling:

campo de testo donde se envia el mensage y ventana de texto donde se reciben los datos y el mensage.

Se que me he esplicado mal, pero no sabria hacerlo mejor.

Muchas gracias.
 :smartass:
Mi mujer tiene un físico bárbaro!!!. Einstein.

jimmy007

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Winsock, Aunke Realmente No Se Se Es Posible
« Respuesta #1 en: Sábado 24 de Septiembre de 2005, 18:36 »
0
Aceptar más de una solicitud de conexión con control Winsock

Es posible aceptar varias solicitudes de conexión con el mismo control si crea una matriz de controles. En este caso, no necesita cerrar la conexión; basta con crear una nueva instancia del control (estableciendo la propiedad Index) e invocar el método Accept de la nueva instancia.

El código que se muestra a continuación presupone que existe un control Winsock en un formulario llamado sckServer y que su propiedad Index tiene el valor 0, por lo que el control forma parte de una matriz de controles. En la sección Declaraciones se declara una variable intMax a nivel de módulo. En el evento Load del formulario, intMax tiene establecido el valor 0 y la propiedad LocalPort del primer control de la matriz tiene el valor 1001. Después, se invoca el método Listen en el control, convirtiéndolo en el control "que escucha". A medida que llega cada solicitud de conexión, el código comprueba si el índice es 0 (el valor del control "que escucha"). Si es así, este control aumenta la variable intMax y utiliza ese número para crear una nueva instancia del control. Esta instancia se utiliza para aceptar la solicitud de conexión.

Código: Text
  1.  
  2. Private intMax As Long
  3.  
  4. Private Sub Form_Load()
  5.    intMax = 0
  6.    sckServer(0).LocalPort = 1001
  7.    sckServer(0).Listen
  8. End Sub
  9.  
  10. Private Sub sckServer_ConnectionRequest _
  11. (Index As Integer, ByVal requestID As Long)
  12.    If Index = 0 Then
  13.       intMax = intMax + 1
  14.       Load sckServer(intMax)
  15.       sckServer(intMax).LocalPort = 0
  16.       sckServer(intMax).Accept requestID
  17.       Load txtData(intMax)
  18.    End If
  19. End Sub
  20.  
  21.  

Saludos.  :hola:

solcito

  • Miembro MUY activo
  • ***
  • Mensajes: 143
    • Ver Perfil
Re: Winsock, Aunke Realmente No Se Se Es Posible
« Respuesta #2 en: Lunes 26 de Septiembre de 2005, 18:06 »
0
Saguxto:

Según lo que yo tengo entendido, en el servidor tienes un puerto de escucha, que quiere decir esto, por ese puerto el servidor recibe todos los pedidos de conexion, siempre es uno. Una vez que recibe un pedido de conexion, si lo acepta abre otro puerto que es por el cual se va a comunicar con el cliente que le hizo el pedido.

Espero se haya entendido.

Saludos  :hola:
Everything that has a beginning has an end.....

jimmy007

  • Nuevo Miembro
  • *
  • Mensajes: 12
    • Ver Perfil
Re: Winsock, Aunke Realmente No Se Se Es Posible
« Respuesta #3 en: Martes 27 de Septiembre de 2005, 04:16 »
0
Citar
Según lo que yo tengo entendido, en el servidor tienes un puerto de escucha, que quiere decir esto, por ese puerto el servidor recibe todos los pedidos de conexion, siempre es uno.

Hasta aki estabas bien pero ...

Citar
Una vez que recibe un pedido de conexion, si lo acepta abre otro puerto que es por el cual se va a comunicar con el cliente que le hizo el pedido.

Como ke si lo acepta abre otro puerto ?, claro ke no.
Tal vez kiciste decir abre otra conexion pero no puerto, y aun asi no es correcto para el control winsock de VB.

El control winsock de VB en modo servidor solo acepta una conexion a la vez por el mismo puerto, si un cliente ya se conecto y un segundo cliente tambien se kiere conectar este segundo cliente no podra conectarse hasta ke se desconecte el primero.

La solucion para ke varios clientes se puedan conectar al mismo tiempo por el mismo puerto y con un solo control winsock es crear una matriz de controles del winsock, como lo puse en el post de mas arriba.

primero al cargar el form donde esta el control winsock con la propiedad index en 0 en modo servidor se pone a la escucha en el puerto ke kieras, en el ejemplo es el 1001, despues cada cliente ke kiera conectarse al servidor por el puerto 1001 se lanzara el evento ConnectionRequest del winsock ke tiene el parametro index ke es el ke identifica ke control es dentro de la matriz, en este caso sera 0 por ke cada cliente ke se kiere conectar al puerto 1001 index sera 0 porke el control de la posicion 0 es el ke se puso a la escucha en el puerto 1001, entonces en el evento ConnectionRequest se comprueba con el if si el index es cero si si lo es se crea una nueva instancia del control en la posicion ke sigue dentro de la matriz, asi cada instancia creada se encargara de cada cliente ke se conecte y de sus peticiones.

En el codigo cada vez ke se crea la nueva instancia en la parte de
Código: Text
  1.  
  2. sckServer(intMax).LocalPort = 0   'aki se le dice con el 0 ke la nueva instancia esta en el mismo puerto original ke se abrio en el caso del ejemplo el 1001.
  3.  
  4. sckServer(intMax).Accept requestID ' aki se acepta la nueva conexion en la nueva instancia.
  5.  
  6.  

Espero ke con esto ya kede claro.

Saludos.

Sagutxo

  • Miembro MUY activo
  • ***
  • Mensajes: 320
    • Ver Perfil
Re: Winsock, Aunke Realmente No Se Se Es Posible
« Respuesta #4 en: Martes 27 de Septiembre de 2005, 10:41 »
0
Salu2. parace que la mejor solución seria la primera, la matriz de controles, aunke aún no he conseguido que me funcione. en algun lugar la conex no se cae, y al intentar volver a leer hace puf. Sigo en ello. Sin duda el error es mio.

Desde luego con 1 solo control está todo el rato esperando a que el servidor esté libre. alguo se queda tirado, es cierto que solo hay que repetir como mucho 2 veces, pero acaba siendo un coñazo.

   Por ahora solo uso un control winsock, que es el que está a la escucha, siempre abierto. Otro control winsock para enviar, que una vez enviado es cerrada la conex para dejer el server libre, y funciona bien excepto en esos momentos que la conex esta saturada, que te hace repetir como es he dicho antes como mucho 2 veces.

He utilizado un control Direcss para que el que recibe lo escuche por los altavoces, que voz mas triste señores :). :whistling:

Muchas gacias por su ayuda, aún no se realmente hacia donde tirar, cuando tome una determinacion se lo hare saber. :smartass:  :comp:
Mi mujer tiene un físico bárbaro!!!. Einstein.

Jose Arriagada

  • Miembro MUY activo
  • ***
  • Mensajes: 373
    • Ver Perfil
Re: Winsock, Aunke Realmente No Se Se Es Posible
« Respuesta #5 en: Martes 27 de Septiembre de 2005, 17:39 »
0
Te adjunto un ejemplo, que se compone de:
- 1 Cliente
- 1 Servidor

El servidor es capaz de soportar multiples conexiones.

Tu ves el codigo, y lo adaptas a tu necesidad.

Espero te sirva.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.