| |||
Hola creo hay varias formas de hacerlo yo por ejemplo una forma que utilize y me fue eficiente es esta Cita: y en el cliente enviava el dato de esta formaDim 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 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: y en la otra parte (cliente o servidor)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 Cita: 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 Winsock1.GetData dato, vbNullString Select Case dato Case Is = "#Confirma#" Winsock1.SendData "#Confirma#"
__________________ www.leandroascierto.com |
| ||||
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 |
| |||
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 |
| |||
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 |
| ||||
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 |
| |||
Cita: 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.
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. |
| |||
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 |
| ||||
Cita: 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.
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¿? 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 |
| |||
Cita: Cierto, era simplemente un apunte (es típico que alguien intente hacer Broadcast a todo Internet jajaja)
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. |
| ||||
Cita: Oye Max me gustaria ver a alguien intentandolo Ja ja ja
Iniciado por MaxExtreme Cierto, era simplemente un apunte (es típico que alguien intente hacer Broadcast a todo Internet jajaja) ![]()
__________________ "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 |
| |||
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. |
| ||||
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 |
| |||
si seria bueno ver como es para fabricar un protocolo propio dinos...
__________________ www.leandroascierto.com |
| |||
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: 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.NuevaConversacion Puerto=6767 ID=15 IniciarConversacionEnParalelo NuevaTransmision Tamaño=10000 Nombre="pepe.txt" ComenzarTransmision .......(datos)...... ............. ......... ........ FinTransmision NuevaTransmision ID=15 TerminarTransmisionEnParalelo 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 |