Ich habe ein Problem mit einem Perl-Skript für Linux. Sein Hauptzweck ist es, als Vermittler zwischen 3 Anwendungen zu fungieren. Was es tun sollte:
- Es sollte in der Lage sein, auf UDP-Text (ohne Leerzeichen) zu warten
$udp_port
- Wenn er diesen UDP-Text empfängt, sollte er ihn an den TCP-Client weiterleiten, der mit ihm verbunden ist
Das Problem ist, dass meine Anwendung derzeit funktioniert, bis ich zum ersten Mal die Verbindung mit dem TCP-Client trenne. Dann kann ich mich nicht mehr mit ihr verbinden, und sie bricht ab, nachdem sie das nächste UDP-Paket auf $udp_port
. Jedes Mal, wenn ich eine neue TCP-Verbindung herstellen möchte, muss ich die App neu starten.
All dies sollte so schnell wie möglich geschehen (jede Millisekunde zählt). Der an UDP oder TCP gesendete Text darf keine Leerzeichen enthalten. Es ist nicht notwendig, mehrere TCP-Clients auf einmal zu unterstützen, aber es wäre sicherlich von Vorteil :-)
Hier ist mein aktueller Code:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
use Net::hostent;
use threads;
use threads::shared;
my $tcp_port = "10008"; # connection from TCP Client
my $udp_port = "2099"; # connection from Announcer
my $udp_password = ""; # password from Announcer
my $title = "Middle Man server version 0.1";
my $tcp_sock = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $tcp_port, Listen => SOMAXCONN,Reuse => 1)|| die @!;
my $udp_sock = new IO::Socket::INET(LocalPort => $udp_port, Proto => "udp") || die @!;
my (@threads);
print "[$title]\n";
sub mySubTcp($)
{
my ($popup) = @_;
print "[TCP][CLIENT CONNECTED]\n";
while (my $answer = <$popup>)
{
chomp $answer;
my ($pass, $announce) = split ' ', $answer;
print $answer . '\n';
}
printf "[TCP][CLIENT DISCONNECTED]\n";
}
my $client = $tcp_sock->accept();
$client->autoflush(1);
my $thr = threads->new(\&mySubTcp, $client);
while ($udp_sock->recv(my $buf, 1024))
{
chomp $buf;
my $announce = $buf;
print "[ANNOUNCE] $announce [START]\n";
print $client $announce . "\n";
print "[ANNOUNCE] $announce [END]\n";
}
Hier ist der Code, den ich nach einigen Vorschlägen versucht, ohne Threading zu gehen. Das Problem ist, auch wenn ich in der Lage bin, eine Verbindung mit TCP Client msg "Trying to setup UDP \n wird nie angezeigt. Wahrscheinlich mache ich etwas falsch. Der TCP-Client stellt nur eine Verbindung her und wartet darauf, dass der Server einige Daten sendet. Udp kommt an, aber es wird nicht akzeptiert. Hier ist der Code:
#!/usr/bin/perl
use strict;
use warnings;
use IO::Socket;
use Net::hostent;
use threads;
use threads::shared;
my $tcp_port = "10008"; # connection from Tcp
my $udp_port = "2099"; # connection from Announcer
my $title = "Middle Man server version 0.2";
my $tcp_sock = IO::Socket::INET->new( Proto => 'tcp', LocalPort => $tcp_port, Listen => SOMAXCONN,Reuse => 1)|| die @!;
my (@threads);
print "[$title]\n";
for (;;)
{
my $open_socket = $tcp_sock->accept();
print "[TCP][CLIENT CONNECTED]\n";
while (my $input = <$open_socket>)
{
print "Trying to setup UDP\n";
my $udp_sock = new IO::Socket::INET(LocalPort => $udp_port, Proto => "udp") || die @!;
while ($udp_sock->recv(my $buf, 1024)) {
chomp $buf;
print "\[ANNOUNCER\] $buf \[START\]\n";
print $open_socket $buf . "\n";
print "\[ANNOUNCER\] $buf \[END\]\n";
}
print "Closing UDP\n";
close $udp_sock;
#chomp $input;
#print $input;
}
close $open_socket;
printf "[TCP][CLIENT DISCONNECTED]\n";
}