Salve,
ho uno script perl che fa una richiesta ad un server in locale e redirige la risposta ad un altro server in rete, il che crea un flusso continuo di dati (streaming):
tuttavia il server remoto causa connessione potrebbe chiudere il Socket $sock2, questo porterebbe ad un fallimento della syswrite e conseguente chiusura del Socket $sock1. Potremmo dire che il Socket $sock2 è bloccante. Ora vorrei fare in modo che quando $sock2 cade $sock1 rimanga attivo ed avevo pensato di dividere il programma in due parti: La prima parte prende i dati dal server locale e li manda in UDP al secondo programma che li riceve in tramite un socket UDP in ascolto su una data porta e li manda al server remoto, in questo modo se il server remoto avesse problemi farebbe cascare il socket UDP che automaticamente verrebbe rilanciato...di seguito c'è il riassuntocodice:# Connect to Local Server ($sock1) # Connect to Remote Server ($sock2) while ( sysread( $sock1, my $buff, 1024 ) ) { syswrite $sock2, $buff; } # Close $sock1; # Close $sock2;
Naturalmente tutto questo è teorico in quanto ancora devo definire lo script, ma la mia domanda era la seguente: sarebbe meglio fare due script separati che si scambiano lo streaming in UDP oppure faccio un file unico che fa fork()? e in entrambi i casi come faccio a fare ripartire File2 se questo si chiude?codice:***File2.pl # ($usock, $uport) Crea un socket UDP localhost in ascolto su una porta a caso. # Salva su /tmp/File2.port il numero della porta ($uport) # Connect to Remote Server ($sock2) # Aspetta il flusso dati: while ( recv($usock, my $buff, 1024, 0) ) { syswrite $sock2, $buff; # # si esce da questo ciclo solo se il server remoto chiude la connessione! # } # close $sock2; # unlink /tmp/File2.port exit; ***File2.pl # Connect to Local Server ($sock1) # Crea un Socket UDP for Sending ($usock); while ( sysread( $sock1, my $buff, 1024 ) ) { if -e /tmp/File2.port { my $port = system(cat /tmp/File2.port); &_udp_send($usock,"127.0.0.1", $port, $buff); } # # Do nothing; # } # Close sub _udp_send { my $USOCK = $_[0]; my $HOSTNAME = $_[1]; my $PORTNO = $_[2]; my $MSG = $_[3]; my $ipaddr = inet_aton($HOSTNAME); my $portaddr = sockaddr_in($PORTNO, $ipaddr); send($USOCK, $MSG, 0, $portaddr) == length($MSG) or return 1; return 0; } exit; ***
grazie



Rispondi quotando