Создание программного роутера - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу построить программный маршрутизатор.

Я написал код, чтобы открыть сокет, получить данные и распечатать полученные данные. GUI будет написан с использованием Tk

Ниже приведена простая версия кода, в основном она делает то, что я хочу сделать, за исключением того, что она не разветвляет подпрограмму new_port. Каждый раз, когда я нажимаю кнопку отправки, окно Tk застревает. Если кто-то может помочь с добавлением разветвления в подпрограмму new_port, чтобы он породил новый дочерний процесс. Идея в том, что я могу заполнить новый порт в форме и нажать sumbit. Окно закрывается, затем я снова нажимаю новый, вставляю новый порт, и теперь второй разъем открыт одновременно с первым. I.E порт 1234 и 5678 прослушиваются одновременно.

#!/usr/bin/perl -w
 use IO::Socket::INET;
 use Tk;

$myip = `ifconfig | grep -i inet | head -1 | cut -d ":" -f2 | cut -d " " -f1`;

sub new_port {
    my $socket = new IO::Socket::INET ( 
        LocalHost => "$myip",
        LocalPort => "$myport",
        Proto => 'tcp'
        Reuse => 1);
die "Cannot create socket on local host" unless $socket;
print "Server waiting for client connection on port $myport\n";

while(1)
{
 my $client_socket = $socket->accept();
 my $client_address = $client_socket->peerhost();
 my $client_port = $client_socket->peerport();
 my $input_data = "";
 my $received_data = "";
 do
 {
   $client_socket->recv($received_data, 65536);
   $input_data = $input_data . $received_data;
 } while ($received_data ne "");
 print "INPUT----------------------------------\n";
 print "Data from $client_address on port $client_port\n";
 print $input_data;
 shutdown($client_socket, 1);
  }
 }

 sub new_port_window {
   my $sw = MainWindow->new;
   $sw->geometry("200x100");
   $sw->title("port opener");
   $sw->Label(-text "Insert port #")->place(-anchor => 'center', -relx => 0.5, -rely => 0.2);
   $sw->Entry(-bg => 'white', -fg => 'black', -textvariable => \$myport)->place(-anchor => 'center', -relx => 0.5, -rely => 0.4);
   $sw->Button(-text "submit", -command => sub{new_port})->place(width => 100,
   -anchor => "center",
   -relx => 0.5,
   -rely => 0.8);
}

 my $mw = MainWindow->new;
       $mw->geometry("150x100");
       $mw->title("GUI TEST NEW FUNCTION");
       $mw->Label(-text => "click new")->place(-anchor => "center", -relx => 0.5, -rely => 0.3);
       $mw->Button(-text => "NEW", -command =>sub{new_port_window})->place(-width => 50, -anchor => "center", -relx => 0.5, -rely => 0.8);
MainLoop;

1 Ответ

0 голосов
/ 14 сентября 2018

Так что я смог заставить это работать с большим количеством экспериментов. Хитрость заключалась в том, чтобы разветвить подпрограмму и сохранить pid в файле, который позднее будет использован для уничтожения процесса, который никогда не завершается из-за бесконечного цикла.

Sub forker {
     $pid = fork ();
      if ( $pid == 0 ) {
          new_port();
      }
      my $pid_file = 'router.pid';
      open (my $pidlog, '>>', $pid_file) or die "cannot open file";
       print $pidlog "$pid\n";
       close $pidlog;
  }
...