linux - 我如何在 Perl 中接受多个 TCP 连接?

标签 linux perl multithreading tcp udp

我对 Linux 的 Perl 脚本有疑问。它的主要目的是成为 3 个应用程序之间的中间人。它应该做什么:

  1. 它应该能够在 $udp_port 上等待 UDP 文本(没有空格)
  2. 当它收到该 UDP 文本时,它应该将它转发给连接的 TCP 客户端

问题是我的应用目前可以正常工作,直到我第一次与 TCP 客户端断开连接。然后我无法再连接到它,它在 $udp_port 上接收到下一个 UDP 数据包后超时。所以基本上每当我想重新连接 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 客户端消息“尝试设置 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";
}

最佳答案

断开连接后,您可能想要循环并再次使用 ->accept 等待新连接。

use strict;use warnings; 找出任何错误也是一个好主意。

编辑:而且我不认为 glob 会按照您认为的那样去做。

关于linux - 我如何在 Perl 中接受多个 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2141028/

相关文章:

java - 使用冲突的参数调用命令行应用程序

ruby - RedHat C 编译器不编译?

xml - 如何用原始标签名称替换 XML::Simple 中的 <opt> 标签?

c - 收到 SIGCHLD 但尚未生成任何子进程

linux - 检查内存页是否加载到内存中

linux - MongoDB 使用了太多内存

java - 停止 servlet 响应

android - Android中的线程示例

mysql - Perl MySQL DBI - 更新并获取最后的值

mysql - 如何避免使用 Perl 将不为空的字段从 csv 插入到 mysql?