He hecho dos funciones distintas en el cliente, una de ellas abre socket, envía una cadena dentro de un for(), cierro socket y mido tiempos. La otra función abre un socket por iteración, envía la cadena, cierra socket por iteración y mido tiempos.
Obviamente la segunda opción tarda más, pero más allá de eso el problema es la inestabilidad de tiempos.
En Linux he probado este cliente/servidor y los tiempos salen prácticamente todos iguales en las distintas pruebas que he hecho. Sin embargo en Windows cada vez me sale una cosa y no veo forma/opción/parámetro para poder estabilizar estas conexiones: cada vez me sale una cosa distinta
Os copio el cliente, el servidor y la salida de consola de los tiempos:
Cliente:
Using perl Syntax Highlighting
- use IO::Socket;
- use Benchmark;
- use Time::HiRes;
- $cantidad = 1000;
- &abro_una_vez;
- &abro_muchas_veces;
- sub abro_una_vez {
- my $tiempo_inicial = new Benchmark;
- $time_cpu = Time::HiRes::time();
- my $sock = new IO::Socket::INET(
- PeerAddr => 'localhost',
- PeerPort => '7070',
- Proto => 'tcp',
- );
- die "Could not create socket: $!\n" unless $sock;
- my $i = 0;
- for ( $i = 0; $i < $cantidad; $i++ ) {
- print $sock " $i - Bazinga!\n";
- }
- close($sock);
- my $tiempo_final = new Benchmark;
- $resulttime_cpu = Time::HiRes::time() - $time_cpu;
- my $tiempo_total = timediff( $tiempo_final, $tiempo_inicial );
- #print "BENCHMARK: $cantidad registros ha costado:",timestr($tiempo_total),"\n";
- print "\n";
- print "TIME:HiRes de $cantidad open/close fuera bucle: $resulttime_cpu";
- print "\n";
- }
- sub abro_muchas_veces {
- my $tiempo_inicial1 = new Benchmark;
- $time_cpu1 = Time::HiRes::time();
- my $i = 0;
- for ( $i = 0; $i < $cantidad; $i++ ) {
- my $sock1 = new IO::Socket::INET(
- PeerAddr => 'localhost',
- PeerPort => '7070',
- Proto => 'tcp',
- );
- die "Could not create socket: $!\n" unless $sock1;
- print $sock1 " $i - Bazinga!\n";
- close($sock1);
- }
- my $tiempo_final1 = new Benchmark;
- $resulttime_cpu1 = Time::HiRes::time() - $time_cpu1;
- my $tiempo_total1 = timediff( $tiempo_final1, $tiempo_inicial1 );
- #print "BENCHMARK: $cantidad registros ha costado:",timestr($tiempo_total1),"\n";
- print "\n";
- print "TIME:HiRes de $cantidad open/close dentro bucle: $resulttime_cpu1";
- print "\n";
- }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4
El Servidor:
Using perl Syntax Highlighting
- use IO::Socket::INET;
- # flush after every write
- $| = 1;
- my ( $socket, $client_socket );
- my ( $peeraddress, $peerport );
- # creating object interface of IO::Socket::INET modules which internally does
- # socket creation, binding and listening at the specified port address.
- $socket = new IO::Socket::INET(
- LocalHost => 'localhost',
- LocalPort => '7070',
- Proto => 'tcp',
- Listen => 5,
- Reuse => 1
- ) or die "ERROR in Socket Creation : $!\n";
- print "SERVER Waiting for client connection on port 7070 \n";
- while (1) {
- # waiting for new client connection.
- $client_socket = $socket->accept();
- # get the host and port number of newly connected client.
- $peer_address = $client_socket->peerhost();
- $peer_port = $client_socket->peerport();
- #print "Accepted New Client Connection From : $peeraddress, $peerport\n ";
- # write operation on the newly accepted client.
- $data = "DATA from Server";
- print $client_socket "$data\n";
- # we can also send the data through IO::Socket::INET module,
- $client_socket->send($data);
- # read operation on the newly accepted client
- $data = <$client_socket>;
- # we can also read from socket through recv() in IO::Socket::INET
- # $client_socket->recv($data,1024);
- #print "Received from Client : $data\n";
- }
- $socket->close();
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Esta es la salida. Como veréis los tiempos son distintos en un orden de magnitud muy elevado (a veces tarda 0.021313 y otras 1.435220 (ejecutando lo mismo) Nótese que abrir/cerrar socket dentro del for() es más estable en tiempo que un socket único
Me he quedado sin ideas, no sé si es directamente problema de Windows o se puede estabilizar tocando el registro de Windows, versión de Perl o algún parámetro. ¿Tenéis alguna idea?
Muchas gracias.