border

Miembros:
Mensajes:
Temas:
Online:

Ultimo Miembro:

 
 

  #1 (permalink)  
Antiguo 02-12-2004, 00:18:38
Avatar de chlsaul
Usuario VIP del Foro
 
Registrado: nov 2003
Ubicación: Trujillo
Posts: 510
chlsaul Valoración +2
Contactar con chlsaul a través de MSN Contactar con chlsaul a través de Yahoo
Predeterminado Asignar puertos

HOla un saludo a todos.

Tengo una aplicacion cliente/servidor, en el cual tengo varios clientes que se conectan al servidor, la pregunta es como hago para asignarle un puerto para cada cliente y ke el servidor pueda recibir lo ke le envia el o los clientes... ?

Gracias de antemano.
Responder Con Cita
  #2 (permalink)  
Antiguo 02-12-2004, 07:52:13
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.266
acalanto ha deshabilitado la reputación
Predeterminado

No sé a que te refieres con 'asignar un puerto a cada cliente'. El puerto por el que se comunican dos o más equipos, debe ser el mismo.

El servidor debe tener un array de controles socket. en el '0' se encuentra la escucha de solicitudes de conexión y cuando le llega una nueva solicitud

load socket(indice)

y por éste gestionarás las comunicaciones entre el servidor y un determinado cliente, pero el puerto siempre será el mismo.

No utilices puertos que ya pueden estar asignados (80, 25 110) ya que te producirá un error.

No sé si me he explicado.
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #3 (permalink)  
Antiguo 02-12-2004, 14:14:02
Avatar de chlsaul
Usuario VIP del Foro
 
Registrado: nov 2003
Ubicación: Trujillo
Posts: 510
chlsaul Valoración +2
Contactar con chlsaul a través de MSN Contactar con chlsaul a través de Yahoo
Predeterminado

HOla Maestro Acalanto Gracias por acudir a mi inquietud.
BUno con lo que lei en su post, entendi que todo lo los clientes envien el servidor lo recibe por el mismo puerto, es asi ?

Y bueno aprovechando, tengo tres preguntas mas:

1° Ahora como haria para declarar un array de sockets ??
2° Como interpretaria el pedido de un cliente para poder recibir los datos en el caso de ke dos o mas clentes envien al mismo tiempo.
3° Cmo haria para identificar que cliente envio ese pedido y asi devolver un resultado.

Bueno disculpe si hago tanta pregunta en un solo post, desde ya se lo agradezco mucho como siempre...
Responder Con Cita
  #4 (permalink)  
Antiguo 02-12-2004, 15:12:19
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.266
acalanto ha deshabilitado la reputación
Predeterminado

Vamos a ver en principio la aplicación Servidor.

Tienes que insertar un control Winsock en el formulario que controle las conexiones, le pones en la propiedad INDEX = 0 y le asignas un puerto.Al cargar la aplicación lo pones a la escucha y fíjate bien que, en este caso concreto, el puerto sería siempre 32000 (Ojo que no puedes usar un puerto que ya esté en servicio porque colisionaría).


Código:
    'Activar Puertos de escucha
    Me.ThreadReceiver(0).LocalPort = 32001
    Me.ThreadReceiver(0).Listen
    DoEvents

Un cliente tratará de conectarse de la siguiente forma, donde threadServer es el nombre o la IP del equipo servidor a la escucha.

Código:
        'Conectar con el controlador de Hilos
        Me.ThreadSocket.RemoteHost = threadServer
        Me.ThreadSocket.RemotePort = 32001
        Me.ThreadSocket.Connect
        DoEvents

y El servidor reaccionará de la siguiente manera para activar la petición



Código:
Private Sub ThreadReceiver_ConnectionRequest(Index As Integer, ByVal requestID As Long)
    Dim ActIndex As Integer
    Dim iniBytes As String
    Dim nd As Node, idx As Long
    On Local Error Resume Next
    Err.Clear
    If Index = 0 Then
        'Comprobar si se puede aprovechar
        'una conexión cerrada.
        If HashReceiver.Count <> 0 Then
            ActIndex = HashReceiver.Item(1): HashReceiver.Remove (1)
        Else
            ActIndex = idReceiver + 1
            idReceiver = idReceiver + 1
        End If
        'Aceptar la conexión
        Load ThreadReceiver(ActIndex)
        ThreadReceiver(ActIndex).LocalPort = 0
        ThreadReceiver(ActIndex).Accept requestID
        DoEvents
        'Analizar si existe alguna tarea asignada
        Err.Clear
        idx = Me.TreeThreads.Nodes((LCase(ThreadReceiver(ActIndex).LocalHostName) + "TASK")).Index
        If Err Or idx = 0 Then
            Set nd = Me.TreeThreads.Nodes.Add(LCase(ThreadReceiver(ActIndex).LocalHostName), tvwChild, (LCase(ThreadReceiver(ActIndex).LocalHostName) + "TASK"), "Multi-Task", 4)
            nd.Expanded = True
        End If
        Err.Clear
        'Asignar nodode tarea al árbol
        Set nd = Me.TreeThreads.Nodes.Add((LCase(ThreadReceiver(ActIndex).LocalHostName) + "TASK"), tvwChild, (LCase(ThreadReceiver(ActIndex).LocalHostName) + "TASK" + Format(ActIndex, "0000")), "Thread_" + Format(ActIndex, "0000"), 6)
        nd.Expanded = True
    End If
    DoEvents
End Sub
Private Sub ThreadReceiver_DataArrival(Index As Integer, ByVal bytesTotal As Long)
    Dim strData As String
    Dim spa As Variant, spb As Variant
    On Local Error Resume Next
    ThreadReceiver(Index).GetData strData
    DoEvents
    spa = Split(strData, "|")
    Select Case UCase(CStr(spa(0)))
        Case "[INIT]"
                        spb = Split(CStr(spa(1)), ";")
                        Me.TreeThreads.Nodes((LCase(ThreadReceiver(Index).LocalHostName) + "TASK" + Format(Index, "0000"))).Text = CStr(spb(2)) + "::" + CStr(spb(1))
        Case "[END]"
                        Me.TreeThreads.Nodes.Remove ((LCase(ThreadReceiver(Index).LocalHostName) + "TASK" + Format(Index, "0000")))
                        HashReceiver.Add Index, ("K" + CStr(Index))
                        Me.ThreadReceiver(Index).Close: DoEvents
    End Select
End Sub

Como puedes ver la petición de conexión siempre se realiza por el INDEX 0 del Array de sockets, Verifico si puedo recuperar uno cerrado (Lo controlo con un Collection) y si no hay idsponibles cargo un nuevo elemento del array y acepto el RequestID solicitado.

A partir de este momento cualquier dato enviado mediante SENDDATA en cualquiera de los sentidos, será recibido por el evento DataArrival.

Que usuario te envía los datos lo puedes controlar por el valor INDEX y si más de un usuario envía al mismo tiempo, recibiras cada petición por el canal adecuado.

No se te olvide poner DOEVENTS para obligar al SO a terminar cualquier proceso pendiente, de lo contrario el mensaje puede quedar en cola hasta que windows decida enviarlo.


Prueba primeramente con esto que te apunto en dos aplicaciones sencillas Server-Cliente y comprenderás como se comporta.


NOTA: en mi código utilizo cosas que no tendrás en tú aplicación, por lo tanto elimina todas las referencias que no encuentre
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #5 (permalink)  
Antiguo 02-12-2004, 15:46:29
Avatar de chlsaul
Usuario VIP del Foro
 
Registrado: nov 2003
Ubicación: Trujillo
Posts: 510
chlsaul Valoración +2
Contactar con chlsaul a través de MSN Contactar con chlsaul a través de Yahoo
Predeterminado

Gracias Maestro.

ahora me pongo en practica todo.
Ahora si no fuera molestia tengo ora pregunta.
Creo ke lo hice ya anteriormente en el foro anterior pero no me kedo claro.

si yo quiero pasar datos del cliente->Servidor o Servidor-> Cliente, por ejemplo un registro completo de una tablas, como podria hacerlo, si cargo esos datos en un array, podria pasar ese array completo co los datos, y que el que lo reciba tambien reciba el aray completo ??
Sauqme de esa duda porfavor y a ver si hay un ejemplo para hacer eso.

Gracias nuevamente.
Responder Con Cita
  #6 (permalink)  
Antiguo 02-12-2004, 16:05:48
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.266
acalanto ha deshabilitado la reputación
Predeterminado

Nunca he probado a pasar un array. No digo que no se pueda hacer pero yo lo que hago es transferir en un stream de cadena y quien recibe desmembra con split().
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #7 (permalink)  
Antiguo 02-12-2004, 16:33:54
Avatar de chlsaul
Usuario VIP del Foro
 
Registrado: nov 2003
Ubicación: Trujillo
Posts: 510
chlsaul Valoración +2
Contactar con chlsaul a través de MSN Contactar con chlsaul a través de Yahoo
Predeterminado

Ok Maestro, lo de juntar el texto si puedo hacerlo pero como haria para desmembrarlo con split() un ejemplo prfavro si no fuera mucho pedir
Responder Con Cita
  #8 (permalink)  
Antiguo 02-12-2004, 16:41:32
Moderador
 
Registrado: dic 2002
Ubicación: Madrid
Posts: 4.266
acalanto ha deshabilitado la reputación
Predeterminado

Split va muy bien para desmembrar cadenas con separador

Código:
dim miarr as variant
miarr = split(stream, ";")

Suponiendo que stream contenga "1;2;3;4;5;6;7;8;9"

miarr se habrá transformado en un array variant tal que

miarr(0) = "1"
miarr(1) = "2"
...
miarr(8) = "9"

Si tienes que pasar a algún tipo de dato debes convertir el variant con Cstr(), cDbl(), Csng(), Int() Clng() etc..
__________________
Un cordial saludo
-Acalanto-

Madrid - España

Visual Basic
Videos Programacion
Foro Programacion
Tutoriales Programacion
Responder Con Cita
  #9 (permalink)  
Antiguo 02-12-2004, 16:57:50
Avatar de chlsaul
Usuario VIP del Foro
 
Registrado: nov 2003
Ubicación: Trujillo
Posts: 510
chlsaul Valoración +2
Contactar con chlsaul a través de MSN Contactar con chlsaul a través de Yahoo
Predeterminado

Mas Claro ni el agua Maestro, Muchas gracias...

Ya luego le molestare con mas dudas...

Gracias
Responder Con Cita
  #10 (permalink)  
Antiguo 03-12-2004, 22:16:58
Gran Participación en el Foro
 
Registrado: feb 2004
Posts: 132
LaNGuiS Valoración +2
Predeterminado

podrias borrar la aprte del codigo del ConnectionRequest por q me estoy mareando y no logro poder conectar las aplcaiciones.

Osae hay cosas que me salta error como por ejemplo treetreadhs ,nodes que no se si es por q no lo tengo en mi prorgama o los tengo con otro nombre

me explicas?

gracias
Responder Con Cita
Respuesta


Herramientas
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Trackbacks are habilitado
Pingbacks are habilitado
Refbacks are habilitado


Temas Similares
Tema Autor Foro Respuestas Último Mensaje
Ayuda con los puertos serie aag1982 Visual Basic 6.00 1 28-12-2006 08:51:08
ayuda con puertos span_cho Visual Basic 6.00 2 16-05-2005 15:36:28
Programaciòn de puertos Dario Visual Basic 6.00 1 19-02-2005 02:43:33
Programa con Puertos JuanKmilo Visual Basic 6.00 1 17-09-2004 01:00:00
Puertos Comm gmon Visual Basic 6.00 1 11-03-1970 11:16:03


La franja horaria es GMT. Ahora son las 23:14:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO 3.1.0
A vBSkinworks Design

Alojado en el servicio Premium de Masquewebs | Diseño mejorado por MasqueWebs

right