Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

impedir que se me unan los mensajes en aplicación cliente servidor

Estas en el tema de impedir que se me unan los mensajes en aplicación cliente servidor en el foro de Visual Basic clásico en Foros del Web. como impedir que se me unan los mensajes resibidos en el evento data arrival...
  #1 (permalink)  
Antiguo 30/03/2006, 12:48
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
impedir que se me unan los mensajes en aplicación cliente servidor

como impedir que se me unan los mensajes resibidos en el evento data arrival
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #2 (permalink)  
Antiguo 31/03/2006, 00:26
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Hola creo hay varias formas de hacerlo yo por ejemplo una forma que utilize y me fue eficiente es esta

Cita:
Dim Resto As String
Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim Dato As String
Winsock1.GetData Dato, vbNullString
Separar (Dato)
End Sub

Sub Separar(Cadena As String)
On Error GoTo Final
Dim Dato As String
Cadena = Resto & Cadena
Resto = ""
Do Until Cadena = ""

If Len(Replace(Cadena, "t#z@", ".")) < Len(Cadena) Then
Dato = Left(Cadena, InStr(Cadena, "t#z@") - 1)
DataArrival2 (Dato)
Cadena = Right(Cadena, Len(Cadena) - Len(Dato) - 4)
Else
Resto = Cadena
Exit Sub
End If
Loop
Exit Sub
Final:
End Sub

Sub DataArrival2(dato as string)
blbalbalba
End Sub
y en el cliente enviava el dato de esta forma

Cita:
Winsock1.SendData Orden & "t#z@"

otra forma es hacer enviando el dato y hacer un do wile asta que contestar el cliente o el servidor por ej:

Cita:
Dim Confirma As Boolean
Sub ConfirmarEnvio()
Confirma = False
Winsock1.SendData "#Confirma#"
While Not Confirma = True 'creo un bucle hasta que confirme la llegada del paquete
DoEvents
Wend
End Sub

Private Sub Enviardato()
For i = 1 To 10
Winsock1.SendData dato(i)
ConfirmarEnvio
Next
End Sub

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim dato As String
Winsock1.GetData dato, vbNullString
Select Case dato
Case Is = "#Confirma#"
Confirma = True
End Sub
y en la otra parte (cliente o servidor)

Cita:
Winsock1.GetData dato, vbNullString
Select Case dato
Case Is = "#Confirma#"
Winsock1.SendData "#Confirma#"
yo en ambas formas me funciona bien porque siempre tienes que tener en cuenta que una cosa, es provarlo en tu pc y otra es con dos pc donde el dato puede tardar mas o menos en llegar y de estas dos formas el dato se separa correctamente
__________________
www.leandroascierto.com
  #3 (permalink)  
Antiguo 03/04/2006, 05:58
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Grasias Leandro me funciona perfentamente. LeandroA llegaste a bajar el modulo y la clase para no tener que usar el winsock. te habia dicho que esta clase no obtenia el ip de la pc al igual que el Winsock , E DESCUBIERTO OTRO problema el Broadcast no funciona si resuelves alguno de estos problemas avisame.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #4 (permalink)  
Antiguo 03/04/2006, 20:44
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
hola no la e provado pero me fije lo de la ip y me da error te paso un codigo para obtener la ip este porlomenos en mi caso me devuelve dos (yo ago una conexion a internet dialup y me da la ip de el servidor y la de mi pc. tenia otro que creo utilizaba otras apis mas adecuadas , pero no lo encuentro despues si lo encuentro te lo paso, encuanto a lo de Broadcast que es lo que hace??

para la ip agrega para provar un timer y dos textbox

Cita:
'Dieser Source stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.
'
'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source !
'
'Autor: Helge Rex [email protected]
'
'Auslesen der lokale Internet-Adresse (IP) und die Adresse
'des Einwahlrechners (Remote)

Option Explicit

' API, zum Ermitteln des Handles zur aktiven DFÜ-Verbindung
Private Declare Function RasEnumConnections Lib "rasapi32.dll" _
Alias "RasEnumConnectionsA" ( _
lpRasCon As Any, _
lpcb As Long, _
lpcConnections As Long _
) As Long

' API, mit der die zugangsdaten ermittelt werden
Private Declare Function RasGetProjectionInfo Lib "rasapi32.dll" _
Alias "RasGetProjectionInfoA" ( _
ByVal hRasConn As Long, _
ByVal rasProjectionType As Long, _
lpProjection As Any, _
lpcb As Long _
) As Long

' Eine kleine Speicherschieber-Funktion
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
Destination As Any, _
Source As Any, _
ByVal Length As Long _
)

' Ein paar Konstanten
Private Const RAS_MaxEntryName = 256
Private Const RAS_MaxDeviceType = 16
Private Const RAS_MaxDeviceName = 32

' Datentyp für die DFÜ-Verbindungen
Private Type RASType
dwSize As Long
hRasCon As Long
szEntryName(RAS_MaxEntryName) As Byte
szDeviceType(RAS_MaxDeviceType) As Byte
szDeviceName(RAS_MaxDeviceName) As Byte
End Type

' Struktur für das TCP/IP-Protokoll
Private Type VBRASPPPIP
dwSize As Long
dwError As Long
szClientIp As String
szServerIp As String
End Type

' helper function
Private Sub BytesToString(strToCopyTo As String, AbPosition As Byte, Laenge As Long)
' Speicher reservieren
Dim strTemp As String
Dim lngLen As Long

' Speicher zum Hineinkopieren bereitstellen
strTemp = String(Laenge + 1, 0)

' Daten kopieren
CopyMemory ByVal strTemp, AbPosition, Laenge

' Länge bis zum NullChar ermitteln
lngLen = InStr(strTemp, Chr$(0)) - 1

' Rückgabe setzen
strToCopyTo = Left$(strTemp, lngLen)
End Sub

Private Function VBRasGetRASPPPIP(hRasConn As Long, udtRASIP As VBRASPPPIP) As Long
' Speicher reservieren
Dim Buffer() As Byte
Dim Result As Long
Dim StructSize As Long

' Größe der UDT festlegen
StructSize = 40&

' Speicher für die API vorbereiten
ReDim Buffer(StructSize - 1)

' Größe der UDT in die UDT kopieren
CopyMemory Buffer(0), StructSize, 4

' IP-Adressen ermitteln
Result = RasGetProjectionInfo(hRasConn, &H8021&, Buffer(0), StructSize)

' Rückgabe setzen
VBRasGetRASPPPIP = Result

' War der Aufruf erfolgreich?
If Result = 0 Then
' Ja, alle Daten kopieren
With udtRASIP
' Größe der UDT kopieren
CopyMemory .dwSize, Buffer(0), 4

' Fehlercode kopieren
CopyMemory .dwError, Buffer(4), 4

' locale IP kopieren
BytesToString .szClientIp, Buffer(8), 16

' remote IP kopieren
BytesToString .szServerIp, Buffer(24), 16
End With
End If
End Function

Private Function GetDFUEHandle() As Long
' Speicher reservieren
Dim RAS(0 To 255) As RASType
Dim StructSize As Long
Dim DFUECount As Long
Dim Result As Long

' Größe der Struktur festlegen
RAS(0).dwSize = 412

' Größe der gesamten Abfrage festlegen
StructSize = (UBound(RAS) - LBound(RAS) + 1) * RAS(0).dwSize

' Die DFÜ-Verbindungen abfragen
Result = RasEnumConnections(RAS(0), StructSize, DFUECount)

' Wurde eine DFÜ-Verbindung gefunden?
If (DFUECount <> 0) Then
' Ja, Handle zurückgeben
GetDFUEHandle = RAS(0).hRasCon
Else
' Nein, Nix zurückgeben
GetDFUEHandle = 0
End If
End Function



Private Sub Form_Load()
' Label und Textbox (eigene IP) beschriften
Me.Text1.Text = vbNullString
Me.Text1.Locked = True

' Label und Textbox (remote IP) beschriften
Me.Text2.Text = vbNullString
Me.Text2.Locked = True

' Timer setzen (5 Sekunden)
Me.Timer1.Interval = 5000
Me.Timer1.Enabled = True

' Gleich aufrufen
Timer1_Timer
End Sub

Private Sub Timer1_Timer()
' Speicher reservieren
Dim RASIP As VBRASPPPIP
Dim RASHandle As Long

' Handle der Verbindung ermitteln
RASHandle = GetDFUEHandle

' Wurde ein Handle gefunden?
If (RASHandle <> 0) Then
' Ja, IPs abfragen
Call VBRasGetRASPPPIP(RASHandle, RASIP)

' IPs mitteilen
Me.Text1.Text = RASIP.szClientIp
Me.Text2.Text = RASIP.szServerIp
Else
' Nicht verbunden
Me.Text1.Text = vbNullString
Me.Text2.Text = vbNullString
End If
End Sub
__________________
www.leandroascierto.com
  #5 (permalink)  
Antiguo 03/04/2006, 20:48
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
aca encontre otro, no lo vi bien y no se porque usa un list para mostrar la ip, me da la espina que lista todas las de una red lan¿?

Cita:
'Dieser Source stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source !

Option Explicit

Private Declare Function WSAGetLastError Lib "WSOCK32.DLL" () _
As Long

Private Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal _
wVersionRequired As Long, lpWSAData As WinSocketDataType) _
As Long

Private Declare Function WSACleanup Lib "WSOCK32.DLL" () _
As Long

Private Declare Function gethostname Lib "WSOCK32.DLL" (ByVal _
HostName As String, ByVal HostLen As Integer) As Long

Private Declare Function gethostbyname Lib "WSOCK32.DLL" _
(ByVal HostName As String) As Long

Private Declare Function gethostbyaddr Lib "WSOCK32.DLL" _
(ByVal addr As String, ByVal laenge As Integer, _
ByVal typ As Integer) As Long

Private Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As _
Any, ByVal hpvSource As Long, ByVal cbCopy As Long)

Private Type HostDeType
hName As Long
hAliases As Long
hAddrType As Integer
hLength As Integer
hAddrList As Long
End Type

Const WS_VERSION_REQD As Long = &H101&
Const MIN_SOCKETS_REQD As Long = 1&
Const SOCKET_ERROR As Long = -1&
Const WSADescription_Len As Long = 256&
Const WSASYS_Status_Len As Long = 128&

Private Type WinSocketDataType
wversion As Integer
wHighVersion As Integer
szDescription(0 To WSADescription_Len) As Byte
szSystemStatus(0 To WSASYS_Status_Len) As Byte
iMaxSockets As Integer
iMaxUdpDg As Integer
lpszVendorInfo As Long
End Type

Private Sub GetIPs()
Dim IP As String, Host As String
Dim x As Integer

Call InitSocketAPI
Host = MyHostName
List1.Clear

Do
IP = HostByName(Host, x)
If Len(IP) <> 0 Then List1.AddItem IP
x = x + 1
Loop While Len(IP) > 0

Call CleanSockets
End Sub

Private Sub InitSocketAPI()
Dim Result As Integer
Dim SocketData As WinSocketDataType

Result = WSAStartup(WS_VERSION_REQD, SocketData)
If Result <> 0 Then
Call MsgBox("'winsock.dll' antwortet nicht !")
End
End If
End Sub

Private Function MyHostName() As String
Dim HostName As String * 256

If gethostname(HostName, 256) = SOCKET_ERROR Then
MsgBox "Windows Sockets error " & Str(WSAGetLastError())
Exit Function
Else
MyHostName = NextChar(Trim$(HostName), Chr$(0))
End If
End Function

Private Function HostByName(Name As String, Optional x As Integer = 0) As String
Dim MemIp() As Byte
Dim y As Integer
Dim HostDeAddress As Long, HostIp As Long
Dim IpAddress As String
Dim Host As HostDeType

HostDeAddress = gethostbyname(Name)
If HostDeAddress = 0 Then
HostByName = ""
Exit Function
End If

Call RtlMoveMemory(Host, HostDeAddress, LenB(Host))

For y = 0 To x
Call RtlMoveMemory(HostIp, Host.hAddrList + 4 * y, 4)
If HostIp = 0 Then
HostByName = ""
Exit Function
End If
Next y

ReDim MemIp(1 To Host.hLength)
Call RtlMoveMemory(MemIp(1), HostIp, Host.hLength)

IpAddress = ""

For y = 1 To Host.hLength
IpAddress = IpAddress & MemIp(y) & "."
Next y

IpAddress = Left$(IpAddress, Len(IpAddress) - 1)
HostByName = IpAddress
End Function

Private Sub CleanSockets()
Dim Result As Long

Result = WSACleanup()
If Result <> 0 Then
Call MsgBox("Socket Error " & Trim$(Str$(Result)) & _
" in Prozedur 'CleanSockets' aufgetreten !")

End
End If
End Sub

Private Function NextChar(Text As String, Char As String) As String
Dim pos As Integer

pos = InStr(1, Text, Char)
If pos = 0 Then
NextChar = Text
Text = ""
Else
NextChar = Left$(Text, pos - 1)
Text = Mid$(Text, pos + Len(Char))
End If
End Function

Private Sub Form_Load()
Call GetIPs
End Sub
__________________
www.leandroascierto.com
  #6 (permalink)  
Antiguo 04/04/2006, 06:32
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Bueno el Broadcast es un sistema de gran utilidad que los usan muchos chat de red locales y juegos. consiste en mandar un mensaje mediante UDP a toda la Red. esto es de gran utilidad ya que al mandar un mensaje a toda la red la otra aplicacion te contesta sin necesidad de tu espesificar el nombre o ip de la otra pc. por ejemplo con el Broadcast le podrias aser una opcion al chat que isiste que seria buscar posibles servidores chat en la red. cuando el servidor resive el mensaje informa al cliente , a decir verdad es una utilidad. no se si as visto juegos que cuando escojes jugar en red ellos mismos te ponen una lista de servidores automatico eso es mediante el Broadcast.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #7 (permalink)  
Antiguo 04/04/2006, 09:14
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por VisualGuallabo
Bueno el Broadcast es un sistema de gran utilidad que los usan muchos chat de red locales y juegos. consiste en mandar un mensaje mediante UDP a toda la Red. esto es de gran utilidad ya que al mandar un mensaje a toda la red la otra aplicacion te contesta sin necesidad de tu espesificar el nombre o ip de la otra pc. por ejemplo con el Broadcast le podrias aser una opcion al chat que isiste que seria buscar posibles servidores chat en la red. cuando el servidor resive el mensaje informa al cliente , a decir verdad es una utilidad. no se si as visto juegos que cuando escojes jugar en red ellos mismos te ponen una lista de servidores automatico eso es mediante el Broadcast.
Bueno, eso en LAN, porque en Internet un Broadcast de esa magnitud no es viable, se usa un servidor central, donde todos los clientes conectan y dicen si están buscando partidas o han creado una.
  #8 (permalink)  
Antiguo 04/04/2006, 12:10
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
Hola si ahora que recuerdo Broadcast era para conectar a todas las pc de una misma Lan con winsock.ocx hay que utilizar remoteHost=255.255.255.255 (nunca lo utilize) ,supongo que con estos modulos deveria de ser igual yo no pude provarlos si llego a tener alguna novedad te aviso

Saludos
__________________
www.leandroascierto.com
  #9 (permalink)  
Antiguo 05/04/2006, 06:33
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Cita:
Iniciado por LeandroA
aca encontre otro, no lo vi bien y no se porque usa un list para mostrar la ip, me da la espina que lista todas las de una red lan¿?
Leandro usa un ListBox para mostrar todas la ip que tengas en tu pc y no las ip de toda la red. es de gran utilidad ya que te debuelbe todas la ip de tu pc en caso que tengas mas de una.

Max cuando digo red Local me refiero a una red Lan aqui de decimos red local.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #10 (permalink)  
Antiguo 05/04/2006, 07:17
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Cita:
Iniciado por VisualGuallabo
Leandro usa un ListBox para mostrar todas la ip que tengas en tu pc y no las ip de toda la red. es de gran utilidad ya que te debuelbe todas la ip de tu pc en caso que tengas mas de una.

Max cuando digo red Local me refiero a una red Lan aqui de decimos red local.
Cierto, era simplemente un apunte (es típico que alguien intente hacer Broadcast a todo Internet jajaja)
  #11 (permalink)  
Antiguo 05/04/2006, 09:54
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Cita:
Iniciado por MaxExtreme
Cierto, era simplemente un apunte (es típico que alguien intente hacer Broadcast a todo Internet jajaja)
Oye Max me gustaria ver a alguien intentandolo Ja ja ja
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #12 (permalink)  
Antiguo 05/04/2006, 10:32
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Para separar los mensajes, podrías fabricarte tu propio protocolo. Es lo que terminamos haciendo todos. Pero no sólo para eso, sino para 1000 cosas más, que puedas utilizar en cualquier aplicación.
  #13 (permalink)  
Antiguo 05/04/2006, 13:22
Avatar de VisualGuallabo  
Fecha de Ingreso: marzo-2005
Mensajes: 288
Antigüedad: 19 años, 1 mes
Puntos: 2
Pues dime como me fabrico mi propio protocolo.
__________________
"No hay lenguaje de programación potente que sea inferior a otro semejante cuando existe un buen programador que lo defiende"

Yosvanis Cruz Alias VisualGuallabo
Ycruz
  #14 (permalink)  
Antiguo 07/04/2006, 12:26
 
Fecha de Ingreso: abril-2005
Mensajes: 351
Antigüedad: 19 años
Puntos: 3
si seria bueno ver como es para fabricar un protocolo propio dinos...
__________________
www.leandroascierto.com
  #15 (permalink)  
Antiguo 07/04/2006, 15:29
 
Fecha de Ingreso: abril-2005
Mensajes: 3.083
Antigüedad: 19 años
Puntos: 17
Pues a ver, te montas un sistema propio para hacer determinadas tareas que uses en bastantes programas, como puede ser transmisión de ficheros, actualización de programas, parches, envío de mensajes, chat integrado con el cliente...

Por ejemplo, un protocolo sería:

Cita:
NuevaConversacion
Puerto=6767
ID=15
IniciarConversacionEnParalelo

NuevaTransmision
Tamaño=10000
Nombre="pepe.txt"
ComenzarTransmision
.......(datos)......
.............
.........
........
FinTransmision

NuevaTransmision
ID=15
TerminarTransmisionEnParalelo
Eso podría ser: Creamos una conversación, que la lleve en un puerto paralelo. Mientras, enviamos un archivo directamente y cuando acabe, cerramos la conversación.

Esto lo puedes practicar fácilmente haciendo un troyanito n00b. ¿Nunca has hecho uno? Enviando cosas como:

Cita:
MoverRaton
Mensaje "Hola aaaaaaa"
BloquearTeclado
BorrarMenuInicio
ApagarOrdenador
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:27.