• Publicidad

Múltiples sockets simultáneos

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

Múltiples sockets simultáneos

Notapor zkizzik » 2007-10-15 18:35 @816

Estaba creando un programa que enviara la misma información conectándose dos veces simultáneamente a un servidor a través del puerto http (80) pero al intentarlo se conecta el primero y después el segundo. ¿Alguna idea?
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Publicidad

Notapor creating021 » 2007-10-15 18:58 @832

Sí, el programa que has hecho es lineal (al parecer).

Tienes que usar (como mínimo) fork(), de lo contrario no sería simultaneo (primero hace una conexión y al terminal hace la otra).
Tienes que crear un proceso hijo (o más) para poder hacer eso o usar Threads.
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor zkizzik » 2007-10-15 19:03 @835

Mi código fue este:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket;
use threads;

$host = $ARGV[0];
$puerto = $ARGV[1];
$N_sockets = $ARGV[2];
$peticion = $ARGV[3];
$i = 1;

$sock = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $puerto, Proto => 'tcp', Timeout => 1) || die ".";

print "Conectando... \n";
while ($i <= $N_sockets) {
print '*';

print $sock $peticion;
$i++;

}
print "\nTerminado.\n";
exit(1);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La idea era crear un número de conexiones simultáneas donde se realiza una petición idéntica una a la otra sin que se desconecten al terminar la petición. Leí una función llamada createsocket o algo así para cargar en memoria sockets y utilizarlas como si fueran index
Código: Seleccionar todo
socket(1) conectar senddata
socket(2) conectar senddata
socket(3) conectar senddata
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Notapor creating021 » 2007-10-16 15:11 @674

No estás creando conexiones simultáneas sino al contrario, creas una sola conexón "lineal" (solo puedes mandar un dato a la vez).

Lo que tenes que hacer es crear varias conexiones para mandar los datos simultaneamente (es decir, usar fork o Threads.pm) teiendo cuidado de no crear un DoS.

http://n-old.ethz.ch/student/vermeul/do ... h17_11.htm
http://www.perl.com/doc/manual/html/pod/perlipc.html

:wink:
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor zkizzik » 2007-10-16 20:45 @906

Realmente lo veo peligroso ya que mi PC podría colapsar al utilizar el programa muchas veces. Hay un programa en Visual Basic que carga sockets en memoria con load.winsock(x) y después winsock(x).connect senddata y si le doy while de 3, entonces se conectan los tres y envía tres paquetes idénticos al mismo tiempo sin que un socket afecte al otro y todo desde un solo control. ¿Podría hacerse esto en Perl? ya que no veo muy productivo crear más procesos para resolver un problema :-/
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Notapor creating021 » 2007-10-17 17:04 @752

No, la verdad es que no... solo tendrías que limitar el número de forks.

Por lo que ahora decís no creo comprender el problema ¿quieres conexiones simultáneas o consecutivas?

Creo que lo que quieres hacer es esto:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use IO::Socket;
use strict;

my ( $host,  $puerto, $N_sockets, $peticion ) = @ARGV;
$| = 1; # "autoflush"
my $i = 1;

my $sock = IO::Socket::INET->new(
    PeerAddr => $host, PeerPort => $puerto,
    Proto    => 'tcp', Timeout  => 1) || die "Sock: $!";

print "Conectando... \n";

while ( $i <= $N_sockets ) {
    print '*';

    $sock->send($peticion); # Mirar funciones send y resiv
    $i++;
}

print "\nTerminado.\n";
exit(1);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor

Notapor zkizzik » 2007-10-19 23:17 @012

Si lo había intentado de esa forma pero tendría que esperar a que se desconecte la primera conexión para comenzar la segunda y la idea es conectar ambas sin depender una de la otra.
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Notapor zkizzik » 2007-10-19 23:26 @018

Estoy siguiendo este ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  #!/usr/bin/perl -w
  # biclient - bidirectional forking client

use strict;
use IO::Socket;
my ($host, $port, $kidpid, $handle, $line);
 
unless (@ARGV == 2) { die "usage: $0 host port" } ($host, $port) = @ARGV;

# create a tcp connection to the specified host and port
$handle = IO::Socket::INET->new(Proto     => "tcp",
                                  PeerAddr  => $host,
                                  PeerPort  => $port)
         or die "can't connect to port $port on $host: $!";
 
  $handle->autoflush(1);              # so output gets there right away

  print STDERR "[Connected to $host:$port]\n";
 
  # split the program into two processes, identical twins
die "can't fork: $!" unless defined($kidpid = fork( ));
 
  if ($kidpid) {                      
      # parent copies the socket to standard output
      while (defined ($line = <$handle>)) {
          print STDOUT $line;
      }
      kill("TERM" => $kidpid);        # send SIGTERM to child
  }
  else {                              
      # child copies standard input to the socket
      while (defined ($line = <STDIN>)) {
          print $handle $line;
      }
  }
  exit;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Cuando pruebo en mi servidor me aparece una sola conexión activa y lo que quiero es que aparezcan dos sin que se desconecten... así ninguna dependería de la otra.
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Notapor explorer » 2007-10-19 23:56 @039

Mira en Network Programming with Perl, sobre todos los ejemplos 7 y 8; y especialmente, el 10.

Usan el fork para crear hijos que se encargan de hacer las peticiones.

Podrías hacer lo mismo para hacer peticiones 'casi' simultáneas a un puerto de un servidor.

Observa al final del ejemplo 10 cómo se espera a que los se mueran, para evitar su "zombificación".
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor zkizzik » 2007-10-20 23:02 @001

Muchas gracias... http://www.linuxjournal.com/files/linux ... 37l10.html

Este era el que necesitaba.

Una última duda... intenté crear un while para poder determinar la cantidad de bucles a un mismo host pero no me resultó muy bien:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
# getservertype2.pl - a forking version
use strict;
use IO::Socket;

$Sitio = '127.0.0.1';
$n = 5;
$i = 1;

$|=1;
my @hosts = qw(
    while ( $i <= $n ) {
        $Sitio
        $i++;
    }
);

print "Iniciando...\n";
sub doit {

    my $server = shift;
    print "Conectado\n";

    my $sock = new IO::Socket::INET( PeerAddr => $server, PeerPort => 80, Proto    => 'tcp');
    $sock or die "$!\n";

    print $sock "Prueba";

    while (<$sock>) {
        if (/^Server:\s*(.*)/) {
            print "$server: $1\n";
            last;
        }
    }
}

my $kid;
for (@hosts) {

    next if $kid = fork;

    die "fork: $!" unless defined $kid;

    doit $_;

    exit;
}

1 while wait != -1;
print "Terminado.\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pensaba que me ahorraría escribir 127.0.0.1 las veces que quería que se conectara :P
zkizzik
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2007-10-15 18:26 @810

Siguiente

Volver a Básico

¿Quién está conectado?

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