Autor
|
Tema: como usar winsock, si es posible, para realizar un minichat (Leído 2,752 veces)
|
fraktal
Desconectado
Mensajes: 128
|
Hola, mi objetivo es hacer una pequeña aplicacion que funcione entre 2 ordenadores por internet y se puedan enviar y recibir archivos. He empleado para ello winsock, pero no me funciona y no se pq. No se si es pq quiza la idea de cliente/servidor para esto es errornea, pues quiza esto que digo seria mas como cliente/cliente, pues se trataria de hacer un ejecutable, el mismo para ambos ordenadores, y realmente me pierdo porque creo que ninguno deberia trabajar como cliente ni servidor... si no a lo mucho ambos como cliente. Pero no me funciona y no se si es pq no se puede hacer mediante winsock o es que lo ago mal. Entonces aber si me podeis ayudar o guiarme o decirme si es que necesito hacerlo con otro control distinto a winsock, que parece mas encaminado a eso, cliente servidor, osea el cliente hace una peticion y el servidor la devuelve si puede... Private Sub cmdconectar_Click() On Error Resume Next ws.RemoteHost = "10.0.0.3" 'meter al ip buena ws.RemotePort = 2001 ws.Close ws.Connect If Not ws.State = 7 Then ws.Close ws.LocalPort = "2001" ws.Close ws.Listen Label1.Caption = "ESCUCHANDO" End If
End Sub
Private Sub cmdenviar_Click() ws.SendData txttexto.Text End Sub
Private Sub Form_Load() nombre = InputBox("Introduce tu nombre de sesion:", "Bienvenido...") If nombre = 1 Then RemoteHost = "10.0.0.3" ElseIf nombre = 2 Then RemoteHost = "10.0.0.3" End If Form1.Caption = nombre & RemoteHost End Sub
Private Sub Timer1_Timer() If Not ws.State = 7 Then ws.Close ws.Connect End If
End Sub
Private Sub ws_ConnectionRequest(ByVal requestID As Long) ws.Close ws.Accept (requestID) Label1.Caption = "CONECTADO"
End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long) Dim datos As String ws.GetData datos rpt = MsgBox(datos, vbOKOnly) End Sub
Explico lo que he exo, no se si lo abre dejado con algo raro pq ya de tantas pruebas no se. Primero cuando carga el formulario pregunta un nombre. Por defecto he puesto 1 y 2 como respuestas para asignar una Ip a la que se conectara. Mas que nada de momento he exo eso para ver si podia yo hacer las pruebas en mi propio ordenador y asignando la misma IP. He puesto la misma IP pq haciendo pruebas anteriroes con Winsock vi que podia hacer un cliente y un servidor y desde mi propio ordenador conectarme del cliente al servidor, entonces deduje que aqui tb podria usar la misma IP. Bien a continuacion abria en el formulario un boton cmdconectar que lo que hace es lo siguiente: Primero trata de conectarse a la ip y al puerto que le digo. Entonces comprueba el estado de la conexion y si es no conectado, lo que hace es que se queda a la espera, osea a la escucha, para ello abre el puerto y se mantiene a la espera. De tal manera, que si abro otra vez la misma instancia del exe, y le doy a conectar, al estar el otro a la escucha en el puerto, pues esta vez la primera parte del codigo funcionaria y se conectaria. Luego esta el procedimiento de que acepta la conexion, y como digo parece que todo va bien, pero es que el problema que veo es que es como si todo fuera en un sentido , y no en los dos, pq solo el procedimiento de DataArrival se produce en uno de los prograamas. Bien luego tengo un texbox donde se pondria el texto a enviar y un boton de enviar. Ademas deun label que dice el estado de la conexion. Entonces escribo en el textbox y de momento antes de ponerme a meterlo en un picturebox, lo que he exo es que ese dato enviado aparezca en pantalla mediante un msgbox... pero como digo no me funciona. Podeis ver el fallo o que pasa?. Muchas gracias. Saludos.
|
|
|
En línea
|
|
|
|
MANULOMM
Desconectado
Mensajes: 559
Erepublik.com
|
bueno la primera duda es que para no tener que utilizar la ocx llames al winsock desde la api (La cual No me la se pues soy semi principiante) lo otro es que el concepto debe ser cliente/servidor pues el servidor abre un puerto colocando a la escucha, entonces por obligacion uno debe ser cliente y otro servidor, estos conceptos no varian la estructura del programa pues el servidor lo unico que hace es abrir un puerto y que el cliente se conecte a el, es algo como el macho y la hembra de un cable.... Espero que esto te sirva....
JUAN MANUEL LOMBANA MEDELLÌN - COLOMBIA
|
|
|
En línea
|
|
|
|
fraktal
Desconectado
Mensajes: 128
|
Ok gracias, sabiendo eso me ayuda pues se que voy por el camino adecuado. Haber entonces si alguien lee el codigo y ve donde cometo el error pues me falla. Eso es lo que yo intentaba acer, primero que intentase conectarse, y si ve que no existe el puerto a la escucha del otro programa esperandole, que se ponga a la espera. Y al ejecutar la otra instancia como lo primero que hace es intentar conectarse a un puerto que escuche, como ya el otro esta escuchando, pues se conecta. Y realmente hasta eso llego bien, pero luego ya cuando invento enviar datos no puedo. Me da un error de programacion. Gracias. S2.
|
|
|
En línea
|
|
|
|
~~
|
Hola: Lo primero una aclaracion a cerca del funcionamiento de los chats un poco decentillos: Creo q funcionan asi: Existe un solo servidor y los usuarios tiene ckientes q se conectan a él (tipo messenger) El servidor se encarga de administrar las combersaciones. Si tu solamente kieres hacer un caht entre dos personas no te hace falta todo esto, con dos aplicaciones como las q estas haciendo ahora te sobra. En cuanto a lo del fallo puede q este aki: Private Sub ws_DataArrival(ByVal bytesTotal As Long) Dim datos As String ws.GetData datos rpt = MsgBox(datos, vbOKOnly) End Sub Sustitulle la ultima linea por msgbox datos,vbokonly,"CHAT" A ver si asi te llegan. Para q los dos programas puedan interactuar tiene q poner el evento ws_DataArrival en ambos. Mira te improviso ahora en un momen un chat para dos pc's: 'La parte de q se conecten y tal la pones como la tuya por ejemplo 'q es siempre lo mismo 'lst es un listbox, ws el winsock, txtMensaje el textbox donde 'escribimos lo q vamos a mandar y cmdMandar el boton donde 'le damos para enviar
Dim nick As String
Private Sub cmdMandar_Click() lst.AddItem (nick & " dice:") lst.AddItem (txtMensaje.Text) ws.SendData "nk" & nick & " dice:" ws.SendData "co" & txtMensaje.Text txtMensaje.Text = "" End Sub
Private Sub Form_Load() nick = InputBox("Introduce nick", nick) End Sub
Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim datos As String ws.GetData datos
If Left(datos, 2) = "nk" Then lst.AddItem (Mid(datos, 3)) End If
If Left(datos, 2) = "co" Then lst.AddItem (Mid(datos, 3)) End If
End Sub Esto lo tienes q incluir en los dos, despues solo te keda poner tb a los dos a la escuxa de un puerto en el formload (por si alguien te kiere hablar) y añadir un boton en el q te puedas conectar a una ip q tienes q escribir en un text box o algo asi (por supuesto esto tb en los dos), digo dos pero con este metodo puedes hablar con todas las personas q kieras, siempre q conozcas su ip, eso si, si kieres q se pueda hablar con varias a la vez tienes q hacer una matriz de controles ws... Si kieres q haga esto dale a buscar, WarGhost tenia por ahi un code muy weno pa esto, y si no pos posteas aki y te intentamos ayudar Espero q te sea util y q funcione, por q lo acabo de escribir, ni sikiera lo e provado xDDDDD pero vamos q tiene pinta de haberme kedado muy chulo, no te parece???? 1S4ludo
|
|
|
En línea
|
|
|
|
fraktal
Desconectado
Mensajes: 128
|
Gracias Eon, luego lo empollo todo. Saludos!
|
|
|
En línea
|
|
|
|
|
fraktal
Desconectado
Mensajes: 128
|
Hola, gracias a todos. Ya he averiguado cual era el problema. El problema es que yo intentaba primero intentar conectar con una posible misma instancia del programa a la escucha. SI eso no se producia, que se pusiera el mismo a escuchar. Y bien, la teoria es buena, pero si yo ejecutaba una instancia, hacia eso, inentaba conectarse, como no abia ninugno a la escucha, el mismo se ponia a la escucha. Hasta ahi todo bien. Luego ejecutaba otra instancia, y en ese momento, ok, conectaba con la otra instancai que estaba a la escucha y aqui viene mi problema pq la siguiente sentencia era if not ws.state = 7 osea le estaba diciendo, que si no estaba conectado, se volviera a poner a la escucha, osea si su estado no era 7. Y resulta, que una vez realizada la conexion, tarda un ratin en cambiar de estado, con lo cual, realmente el estado sigue sin ser 7, con lo cual la segunda instancia entraba en el if y volvia a poner esta instancia a la escucha. De modo, que tuve que arreglarlo con el estado actuar en el cua se encontraba, y tb metiendolo en un timer para darle tiempo a realizar la conexion. Muchas gracias y saludos.
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿Cómo realizar un framework para Java?
Java
|
Tlecoatl
|
4
|
7,836
|
29 Enero 2011, 13:10 pm
por kasiko
|
|
|
[VB.NET] Duda sobre minichat
.NET (C#, VB.NET, ASP)
|
gonzalo57
|
4
|
2,736
|
3 Enero 2013, 22:01 pm
por spiritdead
|
|
|
[Resuelto C++]Configurar IDE para usar WinSock
Programación C/C++
|
NOIS
|
6
|
3,623
|
16 Noviembre 2014, 10:04 am
por NOIS
|
|
|
como realizar un trigger para el control de stock
Bases de Datos
|
geshiro
|
4
|
7,519
|
15 Agosto 2019, 01:24 am
por Hadess_inf
|
|
|
Es posible usar un celular para conectar a Intf de Kismet
Software
|
ElectVocaloid
|
0
|
1,350
|
12 Enero 2018, 00:05 am
por ElectVocaloid
|
|