• Publicidad

Chat con Sockets a nivel de IP

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Chat con Sockets a nivel de IP

Notapor l0cal-eXpl0it » 2011-10-31 19:38 @860

¡Hola!

Bueno, el día de ayer me puse a crear una especie de chat con sockets, utilizando un servidor y un cliente y utilizarlo en localhost. El motivo de este mensaje se debe a dos cosas. Las listo:

  • Que me digan cómo puedo hacer para hacerlo entre dos computadoras con diferentes IP, no en localhost como lo hago actualmente.
  • Que me den recomendaciones de cómo se podría optimizar más el código, para programar más ordenadamente y así.

servidor.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use IO::Socket;
  5.  
  6. # Configuración del servidor
  7. my $servidor = IO::Socket::INET->new
  8. (
  9.         LocalPort => 1717,
  10.         Proto => 'tcp',
  11.         Listen => SOMAXCONN,
  12.         Reuse => 1
  13. ) or die "[ERROR] No se pudo iniciar el servidor: $!.";
  14.  
  15. # Auto refresco del servidor
  16. $servidor->autoflush(1);
  17. print "[Servidor a la espera de conexiones]\n";
  18.  
  19. # Conexión con cada cliente
  20. while(my $cliente = $servidor->accept())
  21. {
  22.         print "[Se ha conectado un nuevo cliente]\n";
  23.         say $cliente "Bienvenido a mis dominios, iniciemos una conversación.";
  24.        
  25.         # Inicio del chat
  26.         while(defined(my $comando = <$cliente>))
  27.         {
  28.                 print ">> $comando\n";
  29.  
  30.                 my $respuesta = <STDIN>;
  31.                 print $cliente $respuesta;
  32.         }
  33.        
  34.         print "[La conexión ha terminado]\n";
  35.         close $cliente;
  36. }
  37.  
  38. close $servidor || die "close: $!";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


cliente.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use IO::Socket;
  5.  
  6. my $servidor = IO::Socket::INET->new
  7. (
  8.         PeerAddr => 'localhost',
  9.         PeerPort => 1717,
  10.         Proto => 'tcp',
  11.         Timeout => 1
  12. ) or die "[ERROR] No se pudo establecer la conexión. $!";
  13.  
  14. STDOUT->autoflush(1);
  15. print "[Conectando con el servidor...]\n";
  16. print scalar <$servidor>;
  17.  
  18. while($servidor->connected)
  19. {      
  20.         my $comando = <STDIN>;
  21.        
  22.         print $servidor $comando; # Envío de texto
  23.         print ">>", scalar <$servidor>; # Respuesta
  24. }
  25.  
  26. close $servidor;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Agradecería bastante sus ayudas :)
Saludos.
l0cal-eXpl0it
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-10-30 03:43 @196

Publicidad

Re: Chat con Sockets a nivel de IP

Notapor explorer » 2011-10-31 20:52 @911

Bienvenido a los foros de Perl en español, l0cal-eXpl0it.

Para usar otra IP, solo puedes hacerlo en el lado del cliente, pues se supone que el servidor siempre va a escuchar en la IP local.

Es la opción 'PeerAddr' la que determina a dónde se tiene que conectar el cliente.

En cuanto a la forma de programar... en CPAN hay varias soluciones para hacer chats, sin tener que bajar al nivel de los Sockets...
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Chat con Sockets a nivel de IP

Notapor l0cal-eXpl0it » 2011-10-31 21:45 @948

Justamente hice eso, pero me sale que no se pudo conectar (lo mismo que me sale cuando no está encendido el servidor). No sé qué debería hacer o en dónde tendría que poner el servidor.pl, actualmente lo tengo en /home/Escritorio/Perl/servidor.pl

Agradezco de antemano :)
l0cal-eXpl0it
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-10-30 03:43 @196

Re: Chat con Sockets a nivel de IP

Notapor explorer » 2011-11-01 07:26 @351

El servidor debe estar escuchando también en la dirección pública de la máquina. Si está escuchando en la dirección 127.0.0.1, no podrá escuchar las peticiones externas.

Seguramente tendrás que poner otra opción PeerAddress, en el servidor.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Chat con Sockets a nivel de IP

Notapor l0cal-eXpl0it » 2011-11-01 09:05 @420

Hola, hice lo que me dijiste pero sigue sin funcionar =S

server (tambien lo hice con PeerAddr en ves de LocalHost pero nada):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.      
  3. use strict;
  4. use IO::Socket;
  5.      
  6. # Configuración del servidor
  7. my $servidor = IO::Socket::INET->new
  8. (
  9.         LocalHost => '186.15.65.65',
  10.         LocalPort => 1717,
  11.         Proto => 'tcp',
  12.         Listen => SOMAXCONN,
  13.             Reuse => 1
  14. ) or die "[ERROR] No se pudo iniciar el servidor: $!.";
  15.      
  16. # Auto refresco del servidor
  17. $servidor->autoflush(1);
  18. print "[Servidor a la espera de conexiones]\n";
  19.      
  20.     # Conexión con cada cliente
  21. while(my $cliente = $servidor->accept())
  22. {
  23.         print "[Se ha conectado un nuevo cliente]\n";
  24.         say $cliente "Bienvenido a mis dominios, iniciemos una conversación.";
  25.            
  26.         # Inicio del chat
  27.         while(defined(my $comando = <$cliente>))
  28.         {
  29.                 print ">> $comando\n";
  30.      
  31.                 my $respuesta = <STDIN>;
  32.                 print $cliente $respuesta;
  33.         }
  34.            
  35.         print "[La conexión ha terminado]\n";
  36.         close $cliente;
  37. }
  38.      
  39. close $servidor || die "close: $!";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


cliente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.      
  3. use strict;
  4. use IO::Socket;
  5.      
  6. my $servidor = IO::Socket::INET->new
  7. (
  8.         PeerAddr => '186.15.65.65',
  9.         PeerPort => 1717,
  10.         Proto => 'tcp',
  11.         Timeout => 1
  12. ) or die "[ERROR] No se pudo establecer la conexión. $!";
  13.      
  14. STDOUT->autoflush(1);
  15. print "[Conectando con el servidor...]\n";
  16. print scalar <$servidor>;
  17.      
  18. while($servidor->connected)
  19. {      
  20.         my $comando = <STDIN>;
  21.  
  22.         print $servidor $comando; # Envío de texto
  23.         print ">>", scalar <$servidor>; # Respuesta
  24. }
  25.      
  26. close $servidor;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
l0cal-eXpl0it
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-10-30 03:43 @196

Re: Chat con Sockets a nivel de IP

Notapor explorer » 2011-11-01 13:41 @612

Para saber si las dos máquinas son visibles, puedes usar antes el comando ping. Desde el lado del cliente, ejecuta ping hacia la IP de la máquina donde está el servidor. Si no responde, entonces es que la máquina cliente no sabe localizar la máquina del servidor.

Por el código que has puesto, has escrito la misma IP, por lo que deduzco


Otra cosa: tienes puesto un Timeout de 1s. Deberías ponerlo un poco más alto.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Chat con Sockets a nivel de IP

Notapor l0cal-eXpl0it » 2011-11-01 22:35 @983

Hice lo que me dijiste del ping y si recibe los paquetes, con 0% de pérdida. Una duda que tengo es si debería colocar el servidor en una carpeta exclusiva (por ejemplo /var/www/) o si no existe problema de que ejecute el cliente y el servidor desde mi PC.

Los archivos los tengo en el escritorio.
l0cal-eXpl0it
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-10-30 03:43 @196

Re: Chat con Sockets a nivel de IP

Notapor explorer » 2011-11-02 03:31 @188

No tiene nada que ver la posición de los programas dentro del ordenador, porque lo que van a hacer es una conexión TCP. No van a "verse" a través del sistema de ficheros, sino a través de puertos socket.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Chat con Sockets a nivel de IP

Notapor l0cal-eXpl0it » 2011-11-02 11:55 @538

¿Entonces qué crees que esté fallando?
l0cal-eXpl0it
Perlero nuevo
Perlero nuevo
 
Mensajes: 5
Registrado: 2011-10-30 03:43 @196

Re: Chat con Sockets a nivel de IP

Notapor explorer » 2011-11-02 12:46 @573

Pues no lo sé.

Prueba a arrancar el servidor. Y luego, desde el cliente, arranca un telnet a esa máquina y puerto, a ver si te responde.

Cabe la posibilidad de que esté activo un cortafuegos, o que la dirección pública solo sea conocida por el equipo que te conecta a Internet (el enrutador ADSL de tu oficina, por ejemplo).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados