У меня проблема со скриптом Perl для Linux. Его главная цель - быть посредником между 3 приложениями. Что он должен делать:
- Должен быть в состоянии ждать текст UDP (без пробелов) на
$udp_port
- Когда он получает этот текст UDP, он должен переслать его клиенту TCP, который подключен
Проблема в том, что мое приложение работает до тех пор, пока я не отключусь с TCP-клиентом в первый раз. Тогда я больше не могу подключиться к нему, и время ожидания истекает после получения следующего пакета UDP на $udp_port
. Таким образом, в основном, когда я хочу восстановить соединение с TCP, я должен перезапустить приложение.
Все это должно быть максимально быстрым (считается каждая миллисекунда). Текст, отправляемый в UDP или TCP, не содержит пробелов. Нет необходимости поддерживать несколько TCP-клиентов одновременно, но это, безусловно, будет преимуществом: -)
Вот мой текущий код:
#!/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";
}
Вот код, который я попробовал после нескольких предложений, чтобы идти без потоков. Проблема даже в том, что я могу подключиться с помощью TCP-клиента. Msgstr "Попытка настроить UDP \ n никогда не отображается. Возможно, что-то я делаю не так. Клиент tcp просто подключается и ждет, пока сервер отправит некоторые данные. UDP прибывает, но это не принимаются. Вот код:
#!/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";
}