Estoy trabajando con mi proyecto final de carrera, y el asunto que me trae ahora entre manos es el tema de la comunicación entre sockets.
He creado un paquete para establecer la comunicación de los sockets y el envío de los datos a través de él. El problema lo tengo cuando intento enviar un mensaje a través del nuevo socket entre cliente-servidor, en el que se me queda bloqueado el servidor esperando a recibir el mensaje del cliente, y el cliente, una vez enviado el mensaje (que no llega al servidor, porque se queda esperando la respuesta), éste se queda bloqueado porque espera la respuesta del servidor.
Aquí pongo el código del paquete para establecer las conexiones:
Using perl Syntax Highlighting
- package Conex;
- use strict;
- use warnings;
- use Socket;
- #####################
- # Variables privades
- #####################
- my $port;
- my $proto = getprotobyname('tcp');
- my $socket;
- my $nouSock;
- #$VERSION = '0.01';
- #Definim la classe del constructor.
- sub new{
- my $class = shift;
- return bless {}, $class;
- }
- # Crea un socket i el fem reutilitzable
- sub crearSock{
- my $self = shift;
- socket($socket, PF_INET, SOCK_STREAM, $proto)
- or die "Can't open socket $!\n";
- print "Socket del modul Conex.pm: $socket\n";
- return($socket);
- }
- sub reusaAdresa{
- my $self = shift;
- my $nomSock = shift;
- print "Socket del modul Conex.pm a nivell reusaAdresa: $nomSock\n";
- setsockopt($nomSock, SOL_SOCKET, SO_REUSEADDR, 1)
- or die "No es pot establir l'opcio del socekt: SO_REUSEADDR $!\n";
- }
- sub bindListen{
- my $self = shift;
- my $nomSock = shift;
- $port = shift;
- my $MAXCON = shift;
- print "Socket del modul Conex.pm a nivell bindListen: $nomSock\n";
- print "maxim connexions: $MAXCON\n";
- # bind a un port, i despres escolta
- print "bind port: $port ------------- bind MAXCON: $MAXCON \n\n\n\n";
- bind($nomSock, pack_sockaddr_in($port, "\0\0\0\0"))
- or die "No es pot fer el bind amb el port: $port!\n";
- listen($nomSock, $MAXCON) or die "No es pot escoltar en aquest port!\n";
- }
- sub acceptarClient{
- # Acceptant connexions
- my $self = shift;
- my $nomSock = shift;
- my $prova;
- print "Socket del modul Conex.pm a nivell Acceptar Connexions: $nomSock\n";
- accept($nouSock, $nomSock);
- return($nouSock);
- }
- sub enviaDada{
- my $self = shift;
- my $socket = shift;
- my $missatge = shift;
- sleep 1;
- print $socket $missatge;
- }
- sub tancarClient{
- # Acceptant connexions
- my $self = shift;
- my $nomSock = shift;
- close $nomSock;
- }
- # La ultima linia sempre ha de retornar True;
- 1;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Y éste es el código que utilizaran los clientes:
Using perl Syntax Highlighting
- package ConexCli;
- use lib ("**********/Projecte Final de Carrera/Xat/Conexio");
- use Conex;
- # '@ISA = qw(Conex)' es llegeix com
- # aquest mòdul 'is a Conex',
- # és a dir, utilitza els mètodes del mòdul Conex
- # i n'hereda la seva classe.
- @ISA = qw(Conex);
- use strict;
- use warnings;
- use Socket;
- my $iaddr;
- my ($paddr,$port,$proto,$adresa,$socket,$dada);
- sub conectarServ{
- # Primer paràmetre és el socket a connectar-se.
- # Segon paràmetre d'entrada es l'adresa del host.
- # Tercer paràmetre el port a connectar-se.
- print @_;
- my ($self,$socket,$adresa,$port) = @_;
- $iaddr = inet_aton($adresa) || die "No Host: $adresa";
- $paddr = pack_sockaddr_in($port, $iaddr);
- print "\nSocket de crear socket en client: $socket\n";
- connect($socket, $paddr) || die "connect: $!";
- print "Socket de connectar socket de client en servidor: $socket\n";
- return($socket);
- }
- sub llegirDada{
- my $self = shift;
- my $socket = shift;
- sleep 1;
- print $socket "Hello, world!\n";
- print "\nPreparar per llegir la dada! ($socket)\n";
- print <$socket>;
- print "\nS'ha rebut la dada!\n";
- }
- # La ultima linia sempre ha de retornar True;
- 1;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
P.D.: Si lo queréis probar, donde pone:
use lib ("**********/Projecte Final de Carrera/Xat/Conexio");
debéis introducir el nombre de la carpeta donde se encuentran los códigos que he puesto en el texto.
Muchas gracias de antemano.