Error con sockets via Internet [VB]

TeKaNeO

Hola a todos:

Escribo esto a ver si alguien puede echarme una manilla con los sockets en Visual Basic :P

Estoy creando una pequeña aplicacion tipo chat entre 2 pcs. Estoy usando el Winsock de VB para ello, y de momento he conseguido que establezca conexion en LAN.

El problema viene al conectar via INET con otro ordenador de un amigo.

Pongo el code:

Private Sub Conectar_Click()
Winsock.RemoteHost = "xxx.xxx.xxx.xxx" '
Winsock.RemotePort = 5555
Winsock.Connect
End Sub

Private Sub Enviar_Click()
Dim Enviar As String
Enviar = Textoaenviar.Text
Winsock.SendData Enviar
End Sub

Private Sub salir_Click()
Winsock.Close
End Sub

Private Sub Winsock_DataArrival(ByVal bytesTotal As Long)
Dim textorecibido As String

Winsock.GetData textorecibido
If textorecibido <> "" Then
datosllegan.Text = textorecibido
end if

End Sub


Bien, donde pongo xxx.xxx... es la IP de mi amigo y abajo el puerto que tiene abierto para conexiones entrantes. El problema esta claro, el no recibe ninguna señal que intento conectar con el cliente que él usa en su pc.

¿Qué hago mal? ¿Via INET es de otro método o algo? He intentado conectar a www.google.com por el puerto 80 tambien pero no recibo señal tampoco :(

Saludos y gracias a quien pueda ayudarme :)

kas

El problema que tienes seguramente es el de los puertos y los routers.

En principio cuando abres un puerto, en una aplicacion, deves abrirlo en el firewall (si tienes, o el de windows) y en el router, antes de arrancar la funcion de envio / recepcion.

Ademas, el pc destino tambien debe hacer esto.

Lo mejor es que pruebes los programas primero en tu makina, luego en LAN y finalmente por internet.

TeKaNeO

Andar, anda perfecto tanto en mi maquina, como en LAN. Mmm no se me habia pasado por la cabeza lo del firewall de windows, que no se si lo tiene activo xD mañana veré si tal, de todos modos pasa una cosa:

A quakenet puedo conectar, de momento no he hecho el sistema de auth con el servidor pero si, me envia datos y tal, he probado con google.com por puerto 80, no se si admite conexiones, pero por probar... y no recibo nada.

Ya veré que sucede, gracias por responder :) si sigo teniendo fallos tras el firewall ya veré como se soluciona.

Saludos^^

kas

quakenet ? google 80? Te estas refiriendo a pruebas que has hecho verdad?

Bueno, en cuanto al tema, sabes algo de TCP/UDP?

Yo he hehco este año una practica de un TFTP (Trivial FTP) Cliente / Servidor, en VB.NET 2005, y me ha quedado muy chula con sus extensiones y demas .. (RFC 1350).

Lo he hecho en UDP por especificaciones de la RFC.

Basicamente, si usas la funcion "Connect()" de un socket, estas trabajando en TCP.

Yo te aconsejo que mires de pasarte a VB.NET 2005, o en su defecto, que continues en VB6, C++ / C# (C .NET), y el tema grafico lo dejes en VB.

Entonces, el codigo que has puesto, es el que ejecutas en las 2 partes? De ser asi, necesitas abrir el puerto 5555 en tdoso los firewalls / routers que haya de por medio. Ademas, ciñiendome al codigo, te faltaria la funcion Escuchar.

Si quieres puedo enviarte un cliente y un servidor TCP BASICOS hechos en Java, quizas te sirvan de ayuda.

IS4kO

De acuerdo con Kas que se está convirtiendo en un Crack si señor, se ve que eso se lleva en la sangre ;)

Pero añadiendo algo más, fijate tb si andas tras un proxy, ya que tendrás que autenticarte en él... con el api .net credentials

SeiYa

www.wallack.es/Cliente.rar
www.wallack.es/Servidor.rar

El servidor acepta múltiples clientes, prueba a ver si te funciona, usa el puerto 1020 juraría, no me acuerdo échale un vistazo si quieres, es tipo IRC (lo imita solo XD)

kas

Se isak0rz que hace mil que no te veo!

Alomejor me da por ahi y os envio a MV los fuentes de mi TFTP Server / Client, para aprendais / critiqueis el tema de sockets!

TeKaNeO

Gracias por las repuestas. Seiya una cosa... ese proyecto es extensiiiiiiiiiiiiiiiiiiiisimo xD es decir, lleva logs, edición de canales, acceso a canales por base de datos.... es demasiado para lo que quiero hacer de momento xD, pero se agradece un montón, estoy enterándome de muchas cosas, sobre todo variables que usaré más adelante :D

Por el momento estoy mirando la parte servidor, ya que la cliente es extensísima, y al recorrerla mediante el debug de VB es una montaña rusa, va de un lao pa otro xDDD

Por otro lado, he conseguido ya hacer la conexión a través de INET. Ahora me encaminaré a ver si saco el tema de conexiones múltiples pero a un solo canal.

Muchas gracias por la respuestas, nuevamente :)

kas

Hombre, has coseguido mandar mensajitos ya de un lao pal otro!?

SeiYa

Una cosa, haz como yo hice, coge un carácter especial, yo cogí la # para las cadenas, es decir, cada vez que pasas una cadena al servidor (yo las envíaba con cabecera):

MENSAJE CANAL hola que tal estáis #

Por que muchas veces te llegan 2 envíos seguidos:

MENSAJE CANAL hola que tal estáis #MENSAJE CANAL Yo bien, gracias #

Para poder dividirlo y demás...

Cualquier problemilla pregunta que yo creo acordarme de algo xD

kas

Te ha pasado eso?

Puede deberse a una lentitud en tu algoritmo de lectura del socket.

Una manera de solucionarlo podria ser usando threads independientes para la lectura del socket y para su procesamiento o interpretacion.

Es decir, una funcion [Listen(..)] que lee del socket. Cuando recibe un paquete de datos, inmediatamente llama a una funcion en un proceso separado, por ejemplo [Process(byte() buf)], de modo que la funcion Listen inmediatamente vuelve a leer del socket.

Esto agiliza la lectura del socket y evita la aglomeracion de paquetes.

Tambien podiras usar una cola (o pipe) donde encolar los mensajes entrantes y que sea la funcion Process la que se dedique a vaciar la cola e ir interpretando.

Son ideas :)

SeiYa

El problema es que está hecho para que exista 1 servidor e indeterminados clientes, por lo que cuando un cliente envía un mensaje a X canal del chat, lo envía al servidor y este a todos los clientes y bueno, se supone que está recibiendo bastante información y en varias ocasiones se aglomeran los paquetes, en su día ya busqué info y no me quedaron más cojones que hacerlo así XD

kas

A eso me refiero, podrias hacer lo siguiente:

Cuando llegue un mensaje al server, y si es de texto, meterlo en una pipe o cola.

Aparte, tener una funcion que lea de una cola o pipe y reenvie a todos los clientes conectados para ese chat, el mensaje.

Si utilizas una pipe, por definicion es asincrona, asi que deveria agilizar la lectura del socket.

SeiYa

El problema es que a veces no llegaba entonces no podías controlar cuando llegase ya que simplemente, a veces no te llegaba un mensaje y otras te llegaban unos seguidos XD

kas

Lo hiciste en UDP? De ser asi no implementaste Stop&Wait y/o timeout + reenvio?

Usuarios habituales

  • kas
  • SeiYa
  • TeKaNeO
  • IS4kO