Visual Basic - sockets

Life is soft - evento anual de software empresarial
 
Vista:

sockets

Publicado por LucianoR (10 intervenciones) el 22/01/2003 03:55:19
Hola, que tal:

HAce varios dias que estoy con este problema y no pude seguir con lo que estaba haciendo.
Les cuento el problema:
Estoy trabajando con control Winsock. Tengo un programa cliente, y un programa
servidor. En eL servidor el control winsock es un array de controles, para que
pueda aceptar varias peticiones de varios clientes. Estoy con el protocolo TCP.
El problema es que cuando quiero mandar un mensaje a todos los clientes ( a traves
del servidor ) , solo le llega el mensaje al ultimo cliente conectado.
lo hago de una forma similar a esta ->

for i=1 to CantClientes
sckServer(i).SendData "MENSAJE PARA TODOS"
next

Si adentro del ciclo for le pongo algo como msgbox"Mensaje enviado",,"chat"
lo hace perfectamente, pero imaginense si quiero mandar un mensaje a 40 clientes,
obiamente me apareceria 40 veces ese mensaje de porqueria.
Pienso que tampoco seria una solucion darle un retardo, porque estariamos
en una ineficiencia similar.

Si alguien sabe por favor que me conteste.
Desde ya, muchas gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:sockets

Publicado por maCo (123 intervenciones) el 22/01/2003 05:27:30
Estas seguro que los todos los clientes estan conectados al servidor ?

cada vez que un cliente se trate de conectar al servidor tienes que buscar
en el array de controles winsock ya creados por uno desconectado, si no hay ninguno cargas uno nuevo con Load() e incrementas la variable del tamano del array.

para mandar un mensaje a todos los clientes, esta bien como lo haces.
tu problema esta en el servidor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por LucianoR (10 intervenciones) el 22/01/2003 06:28:23
Si, del lado del servidor cuento los usuarios que se van conectando y todo. Utilizo el load que me dijiste vos (asi estaba en el msdn )
Le agregue una funcion de retardo con un segundo ( delay(1) )
y funciona correctamente, pero me parece ineficaz, si hay 100 usuarios coenctados , y le quiero mandar mensaje a todos, el usuario Nro 100 le llegaria el mensaje despues de 100 segundos.
Quisiera saber si hay alguna hay alguna constante al cual preguntar por la propiedad winsock.State o algo raro....
Gracias de todos modos....igual sigo con mi duda....
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por maCo (123 intervenciones) el 22/01/2003 07:14:15
no puedo saber el error si ver el codigo.
si gustaslo envias a [email protected]

el control winsock tiene una propiedad para ver si esta conectado
es la propiedad State
Winsock.State = SckConnected
chao
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por Scherzo (42 intervenciones) el 22/01/2003 12:56:49
La verdad es que no estoy seguro, pero por lo que cuentas, creo que los tiros van por el hecho que el control Winsock es asíncrono, es decir, cuando das la orden de enviar datos, la ejecución de código no se para. Por algún motivo que no veo, cuando haces el bucle directamente, sólo te llega el último, pero si pones un MsgBox o un retardo sí te llegan todos. Esto tiene toda la pinta que es debido a esa característica de asincronismo. Debe ser que si no esperas a que el envío de datos se complete, cuando empieza el siguiente paso en el bucle, anula el anterior envío, por eso cuando metes un MsgBox, sí le da tiempo y llegan todos (podrás ver que poniendo un parada (un BreakPoint) en la linea de codigo Next i también llegan todos los mensajes sin usar MsgBox).

Aunque no veo el por qué si no pones una pausa no llegan los mensajes intermedios (ya que se supone que estás usando controles Winsock distintos en un array y deberían ser independientes, posiblemente algo se me escapa), creo que deberías ver alguna forma de sincronizar los envíos, es decir, a lo mejor meter el envío de datos en otro evento, en algún lado en el que puedas verificar que todo el mensaje anterior se ha enviado antes de enviar el siguiente, por ejemplo meter el envío del siguiente mensaje en el evento .SendComplete del Winsock que esté enviando en ese momento.

Aunque no sé si es la solución adecuada, si haciendo eso te funciona, entonces podrás ver que por lo menos es eso lo que te está pasando, que hasta que no se envía en mensaje actual completo, no te deja enviar el siguiente.

No sé si me he explicado correctamente, espero haberte sido de ayuda.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por LucianoR (10 intervenciones) el 22/01/2003 21:06:18
La verdad entendi lo que me dijiste, pero parece que el evente SendComplete lo hace despues de terminar el ciclo for.
Si tuvieras un tiempito, aca te dejo el codigo fuente para que lo veas.
Esta acompañado de un leame.txt, ocupa solo 6 kb
agradecedira cualquier tipo de respuesta a quien me ayude
la pagina es http://www.ramasoft.com.ar/chat.html

Muchas gracias por todo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por Scherzo (42 intervenciones) el 23/01/2003 17:47:35
Si te está saltando el evento SendComplete sólo al final del bucle, apostaría casi seguro que entonces es por el tema del asincronismo, ya que debería saltarte un evento SendComplete por envío. ¿Estás seguro que todos y cada uno de los sockets están conectados en el momento del envío?. Voy a echar un ojo al código fuente por si hubiera suerte y viera algo que me permitiera intuir por dónde van los tiros.

Mañana te cuento lo que haya visto, que hoy se acaba el día y no me da tiempo.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por LucianoR (10 intervenciones) el 24/01/2003 04:04:10
Gracias por la ayuda, cuaquier cosa avisame al mail.
Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por Scherzo (42 intervenciones) el 24/01/2003 14:39:12
Estuve mirando tu código fuente y lo único que he visto que pudiera ser una solución es lo suiguiente:

En el parte del Servidor, en el evento CmdTodos_Click(), yo dejaría este código:

Private Sub CmdTodos_Click()
sckServer(1).SendData "A TODOS"
End Sub

Suponiendo que los controles empiecen en el 1, si empezasen en el 0, sería un 0

Y luego en el evento sckServer_SendComplete()

Private Sub sckServer_SendComplete(Index As Integer)
If Index < CantUsuarios Then
sckServer(Index + 1).SendData "A TODOS"
End If
End Sub

De esta forma, creo que debería esperar a que llegue un mensaje antes de enviar el siguiente, dando tiempo a que lleguen todos y no sólo el último mensaje enviado.

No lo he podido probar en ejecución, pero creo que suena razonable. Espero que te sirva.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sockets

Publicado por LucianoR (10 intervenciones) el 24/01/2003 19:34:48
Gracias, funciono re bien
sos un maestro!

Gracias nuevamente!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar